使用openid connect而不重定向到安全令牌服务

时间:2015-09-21 21:13:06

标签: asp.net-mvc-5 oauth-2.0 openid-connect identityserver3

我有几个ASP.NET MVC站点将Identity Server 3用作共享安全令牌服务。

这些网站需要自己的本地登录页面。今天,他们使用WS-Trust对Identity Server 2进行身份验证,但我们希望将它们升级为在Identity Server 3上使用OpenID Connect。

我们找不到任何OpenID连接支持这种活动身份验证的情况,所以我们改为追求OAuth2资源所有者流程。

我解决这个问题的第一个尝试如下:

Startup.cs

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    TicketDataFormat = new AuthTicketDataFormat(),
    AuthenticationType = Auth.ssoAuthenticationType,
    LoginPath = new PathString("/account/login"),
    CookieName = ConfigurationManager.AppSettings["SsoCookieName"],
    CookiePath = "/",
    CookieDomain = ConfigurationManager.AppSettings["SsoCookieDomain"],
});

AccountController.Login (帖子)有:

var client = new TokenClient(
    ssoBaseUrl + "/connect/token",
    ssoClientId,
    ssoClientSecret);

var token = client.RequestResourceOwnerPasswordAsync(userName, password, ssoScope).Result;

var client = new HttpClient();
client.SetBearerToken(token.AccessToken);

var token = client.GetStringAsync(ssoBaseUrl + "/connect/userinfo").Result;

var jwt = new JwtSecurityToken(new JwtHeader(), JwtPayload.Deserialize(token));

var claims = jwt.Claims;

var id = new ClaimsIdentity(claims, Auth.ssoAuthenticationType, "email", "roles");
Request.GetOwinContext().Authentication.SignIn(id);

这有效但...... 我们认为应该有一个简化过程的owin组件。例如,我们可以看到以下扩展方法,但它们似乎都没有取代我们上面的内容:

app.UseIdentityServerBearerTokenAuthentication(
    new IdentityServer3.AccessTokenValidation.IdentityServerBearerTokenAuthenticationOptions {})

app.UseOAuthAuthorizationServer(new OAuthAuthorizationServerOptions{})

app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions{})

app.UseOpenIdConnectAuthentication(
    new Microsoft.Owin.Security.OpenIdConnect.OpenIdConnectAuthenticationOptions{})

尽管我们尽最大努力使它们适应我们的情况,但这些扩展方法似乎从来没有取代我们上面的工作代码的需要,我们在启动时手动接触令牌和userinfo端点以及cookie身份验证。

我们是否遗漏了某些内容,或者我们的解决方案是针对这种情况的最佳解决方案...使用我们自己的登录页面进行主动身份验证,但使用最新的安全技术来实现它(OpenID connnect / OAuth2)?

1 个答案:

答案 0 :(得分:3)

如果您想要在没有重定向的情况下登录,则必须使用资源所有者密码授予流程。请参阅其中一位Identity Server作者的article。它适用于ID服务器2,但它应该仍然有用。还有来自documentation的一些信息,这是一个如何(在ID服务器谈话中称为资源所有者密码凭证授权)的示例。

话虽这么说,这个流程只是在框架中,因为它有点被OAuth 2.0规范的一些贡献者所强迫,实际上它违背了OpenID / OAuth的想法。将您的网站重定向到login.yoursite.com可能看起来很麻烦,但实际上它应该是您应该做的。在用户体验方面,我在工作中与一个用户体验工作者聊天(因为我关注用户体验),他说现在这是一种常见的经验(至少在企业中)并且它并没有。从用户体验中减去,因为在重定向的掩护下,所有的魔法都不会被他们看到。

我强烈建议使用重定向的隐式流程。你应该如何做到这一点简单明了。