我正在尝试构建一个由 ASP.NET Web API 后端支持的 Angular 6 应用程序。该应用程序根据单独的 Identity Server 4 对用户进行身份验证,该服务器联合Azure AD,最终返回 Bearer 参考令牌。
从登录名然后进行身份验证(令牌)的角度来看,一切正常。用户访问网站,重定向到Azure AD,登录,然后重定向回到Angular 6应用程序。对于API调用,令牌被注入到标头中,并且ASP.NET Core身份验证中间件验证令牌并返回数据。
services
.AddAuthentication(options => {
options.DefaultScheme = IdentityServerAuthenticationDefaults.AuthenticationScheme;
options.DefaultAuthenticateScheme = IdentityServerAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = IdentityServerAuthenticationDefaults.AuthenticationScheme;
options.DefaultSignInScheme = IdentityServerAuthenticationDefaults.AuthenticationScheme;
})
.AddIdentityServerAuthentication(options => {
options.Authority = AuthClient.SsoBaseUrl;
options.RequireHttpsMetadata = false;
options.ApiName = AuthClient.SsoClientName;
options.ApiSecret = AuthClient.SsoClientSecret;
});
我的问题是我正在尝试合并ASP.NET Core身份,并且不确定在哪里/如何绑定通过claims principal
返回的AddIdentityServerAuthentication
。
在此应用程序的先前版本(ASP.NET Framework 4.7)中,我们使用了Ws-Federation
,它重定向回ExternalCallbackLogin()
中的AccountController
,并执行通常的AuthenticationManager.GetExternalLoginInfoAsync()
,然后SignInManager.ExternalSignInAsync()
,然后是(如果需要)AppUserManager.CreateAsync()
和AppUserManager.AddLoginAsync()
。
这段代码基本上检查了[AspNetUserLogins]
表中提供者特定的密钥(来自声明)以映射到[AspNetUsers]
表中的用户。
更改为IdentityServer4.AccessTokenValidation
后,我不知道该放在哪里。由于我使用的是引用标记,因此好像没有引发JwtBearerEvents
(特别是OnTokenValidated
事件)。实际上,它确实不看起来像有个Introspection
事件... ??
我尝试过在称为上述“管理器”方法的测试端点中测试逻辑(从技术上讲,它是对ASP.NET Core Identity
等价方法的更新),但也无法正常工作。
例如,第一次调用SignInManager.GetExternalLoginInfoAsync()
会返回null
。
我在做什么错了?