我有一个用于MVC Core的工作AuthenticationHandler<>,它运行良好。现在我想在身份服务器 4 中重用整个东西,但框架似乎对我不利。
我已添加
builder.Services.AddAuthentication().AddScheme<MyWebsiteOptions, MyWebsiteAuthenticationHandler<TIdentity, MyWebsiteUser>>(CredentialStoreConstants.SCHEMA_NAME, x => { x.ConnectionString = options.ConnectionString; });
就像我说的,它对MVC核心部分100%有效。现在,我无法像/connect/authorize/callback
一样访问 IdentityServer4 端点。我已经一遍又一遍地阅读了身份服务器 4 文档,但不知何故,我在这里错过了一些关键的东西。
有人有想法吗?我相信我不是第一个遇到这种情况的人。
身份服务器端点就是作为管道中间件实现的普通端点。
身份服务器4上的相关文件包括:
- 中间件:https://github.com/IdentityServer/IdentityServer4/blob/master/src/IdentityServer4/src/Hosting/IdentityServerMiddleware.cs
- 端点路由器(及其接口(:https://github.com/IdentityServer/IdentityServer4/blob/master/src/IdentityServer4/src/Hosting/EndpointRouter.cs 端点
- 实现(例如令牌端点(:https://github.com/IdentityServer/IdentityServer4/blob/master/src/IdentityServer4/src/Endpoints/TokenEndpoint.cs
这意味着他们不在MVC中,所以你不能和他们一起使用你的AuthenticationHandler
提示:如果您阅读了所有文档并且答案不存在,那么是时候深入研究代码了:https://github.com/IdentityServer/IdentityServer4
答案。这比我想象的要明显得多。
对于标准的 .NET Core 身份验证,在AuthenticationHandler<>
时成功通过是不够的
如果您有自定义用户类型和自定义登录流程,则在成功验证所述自定义用户类型的凭据后,还需要执行类似操作。
有时,您需要从数据库中检索相应的用户,并将其检索到 MVC Core 身份验证流的其余部分。
因此,在类似AuthenticationHandler<>().Succeeded == true
之后,您需要执行以下操作:
var systemUser = await _userResolver.GetUserAsync(user.Email);
await _signInManager.SignInAsync(systemUser, true);
最后一行是最重要的,因为它初始化了正确的MVC Core用户会话