繁体   English   中英

尝试将IdentityServer4添加为具有自定义用户存储的Javascript应用程序的身份授权

[英]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帖子以及其他内容为IResourceOwnerPasswordValidatorIProfileService提供实现。

我已经完成了此操作,现在仅使用虚拟用户存储库,该存储库可与一组虚拟内存用户(而不是真正的外部存储)一起使用。 我的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方法。 但是 ,偶然地发现,如果我输入bobalice作为用户名和密码(例如,输入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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM