2

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

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

我们找不到任何这样的 OpenID 连接支持主动身份验证的情况,因此我们改为采用 OAuth2 资源所有者流程。

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

启动.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 (post) 有:

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{})

尽管我们尽最大努力让它们适应我们的情况,但这些扩展方法似乎从未取代我们对上面工作代码的需求,我们在启动时手动访问令牌和用户信息端点以及 cookie 身份验证。

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

4

1 回答 1

3

如果您想在不重定向的情况下登录,则必须使用资源所有者密码授予流程。请参阅Identity Server 作者之一的文章它适用于 ID 服务器 2,但它应该仍然有用。文档中还有一些信息是如何做的示例(在 ID 服务器谈话中,他们称之为资源所有者密码凭证授予)。

话虽这么说,这个流程只是在框架中,因为它有点被 OAuth 2.0 规范的一些贡献者强制引入,实际上它有点违背 OpenID/OAuth 的想法。让您的网站重定向到 login.yoursite.com 可能看起来很麻烦,但实际上这是您应该做的。在用户体验方面,我在工作中与一位 UX 人员聊天(因为我对 UX 有顾虑),他说现在(至少在企业中)这是一种足够普遍的体验,并且不会从用户中减去体验所有魔法在重定向的掩护下发生在他们看不见的地方。

我强烈推荐使用重定向的隐式流程。这很简单,只是你应该怎么做。

于 2015-09-21T22:19:31.420 回答