【问题标题】:use openid connect without redirecting to security token service使用 openid 连接而不重定向到安全令牌服务
【发布时间】:2015-12-18 17:02:39
【问题描述】:

我有几个 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{})

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

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

【问题讨论】:

  • 你有没有想过这个问题?我也有同样的情况。如果没有,至少感谢上面的工作代码。

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


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的及时回复和链接/建议。我们确实了解有关 OAuth2 资源所有者密码授予流程的担忧。在我们的案例中,这些是我们内部拥有并完全控制的受信任的 Web 应用程序,因此它们与资源所有者流程的参数非常吻合。此外,所有站点的登录页面都有共享登录页面无法满足的内容要求。我们的问题不是我们是否应该使用这个流程。相反,我们希望找到一种更简单的方法来使用预构建的 owin 扩展来实现它。
  • 我也很好奇在不重定向的情况下获取令牌和用户信息,因为我同时控制客户端应用程序和身份验证服务器。几乎所有示例都将重定向与客户端应用程序是身份验证服务器的第三方的用例一起使用。在我的情况下,该应用程序是一个 SPA,我们使用此流程将用户/通过 https 发送到我们的身份验证服务器
猜你喜欢
  • 2022-11-09
  • 2018-10-26
  • 2020-05-18
  • 1970-01-01
  • 1970-01-01
  • 2021-11-05
  • 2015-08-01
  • 1970-01-01
  • 2011-08-29
相关资源
最近更新 更多