IdentityServer4实战:自定义用户名和密码校验
前言
前几篇中我们使用 用户密码模式 生成的token所使用的用户全部都是模拟的测试用户,通过 AddTestUsers(IdentityServerHost.Quickstart.UI.TestUsers.Users) 方式注入到服务中的,实际项目中用户数据都是从数据库而来,在编译期是不知道都有哪些用户的。本篇笔者介绍如何通过数据库校验用户名和密码的合法性。
IResourceOwnerPasswordValidator 接口
ids4 为开发者提供了一个 IResourceOwnerPasswordValidator 接口,通过实现该接口可以做自己的用户名和密码的校验。
该接口约定用户信息校验成功或失败后必须设置 context.Result 的值,在实现代码中我们会对该值就行说明。
自定义 CustomerResourceOwnerPasswordValidator
在项目 MicroShell.IdentityServer4.Server 中新建 CustomerResourceOwnerPasswordValidator 类,实现 IResourceOwnerPasswordValidator 接口,具体代码如下:
/// <summary> /// 自定义用户校验 /// </summary> public class CustomerResourceOwnerPasswordValidator : IResourceOwnerPasswordValidator { protected readonly TestUserStore Users; public CustomerResourceOwnerPasswordValidator() { // 方便起见,这里的用户数据我们还是使用 IdentityServerHost.Quickstart.UI 模板中的,实际项目可以通过数据库访问组件从数据库获取用户 Users = new TestUserStore(TestUsers.Users); ; } public async Task ValidateAsync(ResourceOwnerPasswordValidationContext context) { if (Users.ValidateCredentials(context.UserName, context.Password)) { // 用户名和密码校验成功 context.Result = new GrantValidationResult( subject: Users.FindByUsername(context.UserName).SubjectId, authenticationMethod: "custom" ); } else { // 用户名和密码校验失败 context.Result = new GrantValidationResult(TokenRequestErrors.InvalidGrant); } return; } }
注入 CustomerResourceOwnerPasswordValidator
本文转载自:https://limitcode.com/detail/60701ab591dfde22104dcf13.html