![](/img/trans.png)
[英]IdentityServer4 can't add asp net core identity with custom user store
[英]Trying to add IdentityServer4 as identity authority for a Javascript application with custom user store
我已遵循IdentityServer4文档,使用默认的测试配置(带有内存中的客户端和用户)创建了基本的本地实现。 此时,IS4初始化如下:
services.AddIdentityServer()
.AddDeveloperSigningCredential()
.AddInMemoryIdentityResources(Config.GetIdentityResources())
.AddInMemoryApiResources(Config.GetApiResources())
.AddInMemoryClients(Config.GetClients())
.AddTestUsers(Config.GetUsers());
然后,我按照说明使用oidc-connect库创建简单的Javascript应用程序。 这工作正常,所以现在我有了一个Javascript应用程序,该应用程序允许用户通过我的IS4实例登录。 根据说明,此JS应用程序在IS4中使用隐式流表示为客户端。
现在,我想将IS4实例与我的真实用户存储区集成在一起。 阅读了几篇文章后,似乎我需要根据本SO帖子以及其他内容为IResourceOwnerPasswordValidator
和IProfileService
提供实现。
我已经完成了此操作,现在仅使用虚拟用户存储库,该存储库可与一组虚拟内存用户(而不是真正的外部存储)一起使用。 我的IS4初始化现在看起来像这样:
services.AddIdentityServer()
.AddDeveloperSigningCredential()
.AddInMemoryIdentityResources(Config.GetIdentityResources())
.AddInMemoryApiResources(Config.GetApiResources())
.AddInMemoryClients(Config.GetClients());
builder.Services.AddTransient<IProfileService, CustomProfileService>();
builder.Services.AddTransient<IResourceOwnerPasswordValidator, CustomResourceOwnerPasswordValidator>();
现在,当我回去测试我的Javascript应用程序时,它就变得很奇怪。 尝试登录时,我进入了IS4登录屏幕。 输入希望使用的凭据,但返回无效的用户名或密码 。 调试我可以看到代码从未在CustomResourceOwnerPasswordValidator
输入我的ValidateAsync
方法。 但是 ,偶然地发现,如果我输入bob或alice作为用户名和密码(例如,输入bob作为用户名和密码),那么我已经通过身份验证,可以返回到我的应用程序。 这没有任何意义。 我确信这些是IdentityServer4示例内存用户使用的两个默认用户名,这并不是巧合,但是您可以在上面看到我不再使用内存用户。 事实上,即使当我发表意见,这是仍然如此GetUsers
方法出Config.cs
。
我无法解释这一点,但是无论如何,我想要的是能够使用我的用户存储。 因此,我进一步阅读了一些建议,我只能将IResourceOwnerPasswordValidator
与具有GrantTypes.ResourceOwnerPassword
客户端GrantTypes.ResourceOwnerPassword
。 但是,当我改变我的JavaScript应用程序的客户端IS4使用这笔款项的类型,当我尝试登录我看到一个unauthorized_client错误。
所以我被卡住了。 我曾经以为,由于我的设置与内存中的用户一起使用,因此使用真实的用户存储不会有太多工作,但是显然我缺少了一些东西。 您的指导将不胜感激。
您无需在服务中将ProfileService
注入为依赖项。
您需要类似:
services.AddIdentityServer()
.AddProfileService<CustomProfileService>()
//..... more code
而且,您的CustomProfileService
不需要实现IProfileService
(该方法接受通用)。
真正的“魔术”发生在AccountController
中:
/// <summary>
/// Handle postback from username/password login
/// </summary>
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Login(LoginInputModel model)
{
// logic
}
在那里,在LoginInputModel
您具有用户名,密码等。您需要进行验证,因此最后,如果您正在编写自定义用户管理,则不需要IProfileService
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.