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