我已经搜遍了如何在asp.net核心中使用IdentityServer4注册 UserService
,但我似乎找不到正确的方法来做到这一点 .
这是注册InMemoryUsers找到here的代码,但我想从我的MSSQL DB访问用户,而不是样本中定义的静态用户 .
var builder = services.AddIdentityServer(options =>
{
options.SigningCertificate = cert;
});
builder.AddInMemoryClients(Clients.Get());
builder.AddInMemoryScopes(Scopes.Get());
builder.AddInMemoryUsers(Users.Get());
那么我看了this这是 IdentityServer3 .
var factory = new IdentityServerServiceFactory()
.UseInMemoryClients(Clients.Get())
.UseInMemoryScopes(Scopes.Get());
var userService = new UserService();
factory.UserService = new Registration<IUserService>(resolver => userService);
从在线阅读看起来我需要使用DI系统注册UserService,但我不确定它如何绑定到IdentityServer,例如 .
services.AddScoped<IUserService, UserService>();
所以我的问题是:
如何将 UserService
绑定到构建器(IdentityServer4用户)?我将如何调用我的数据库来访问和验证 UserService
中的现有数据库用户(我使用存储库连接到数据库)?
考虑到这一点必须与 asp.net core 一起使用 .
谢谢!
3 回答
在IdentityServer4中 .
IUserService
不再可用,现在您必须使用IResourceOwnerPasswordValidator
进行身份验证并使用IProfileService
来获取声明 .在我的场景中,我使用资源所有者授权类型,我所需要的只是根据用户名和密码获取用户声称为我的Web API执行基于角色的授权 . 我认为主题对每个用户都是独一无二的 .
我在下面发布了我的代码,它可以正常工作;有人能告诉我,我的代码有什么问题吗?
在startup.cs中注册这两个服务 .
实现
IResourceOwnerPasswordValidator
接口 .实现
ProfileService
接口 .Update - IdentityServer 4 has changed and replaced IUserService with IResourceOwnerPasswordValidator and IProfileService
我使用我的UserRepository从数据库中获取所有用户数据 . 这被注入(DI)到构造函数中,并在_921228中定义 . 我还为身份服务器创建了以下类(也是注入的):
首先定义
ResourceOwnerPasswordValidator.cs
:和
ProfileService.cs
:然后在
Startup.cs
我做了以下事情:您还需要
Config.cs
来定义您的客户,api和资源 . 你可以在这里找到一个例子:https://github.com/IdentityServer/IdentityServer4.Demo/blob/master/src/IdentityServer4Demo/Config.cs您现在应该能够调用IdentityServer / connect / token
有关更多信息,请查看文档:https://media.readthedocs.org/pdf/identityserver4/release/identityserver4.pdf
Old answer (对于较新的IdentityServer4,这会 not 工作了)
一旦你理解了事物的流动,它就非常简单 .
像这样配置IdentityService(在Startup.cs -
ConfigureServices()
中):然后设置您的UserService
基本上通过将
UserService
注入builder
(类型为IdentityServerBuilder
)Services
,允许它在auth上调用UserService .我希望这能帮助别人,因为我花了几个小时才能实现这一目标 .
在IdentityServer4 1.0.0-rc5中,IUserService和CustomGrantValidationResult都不可用 .
现在,您需要设置context.Result,而不是返回CustomGrantValidationResult .
Resource Owner Password Validation