.net core 3.1 Identity Server4 (自定义模式) 电脑版发表于:2021/1/18 13:28 ![.netcore](https://img.tnblog.net/arcimg/hb/c857299a86d84ee7b26d181a31e58234.jpg ".netcore") >#.net core 3.1 Identity Server4 (自定义模式) [TOC] ![](https://img.tnblog.net/arcimg/hb/8e4abea9067d4157944d80e90497ace8.png) tn>IdentityServer4除了提供常规的几种授权模式外(AuthorizationCode、ClientCredentials、Password、RefreshToken、DeviceCode),还提供了可以拓展的授权模式,下面就根据源码简单说下IdentityServer4是如何实现自定义授权模式的。 >### 创建CustomAuthCodeValidator类 ![](https://img.tnblog.net/arcimg/hb/a2ea4da918da4d86936094a89c2ae4cc.png) tn>`IExtensionGrantValidator`接口实现了自定义验证的扩展。接着我们通过编写简单的源码实现验证逻辑。 ```csharp public class CustomAuthCodeValidator : IExtensionGrantValidator { private readonly UserManager<IdentityUser> _userManager; public CustomAuthCodeValidator(UserManager<IdentityUser> userManager) { _userManager = userManager; } public string GrantType => "auth_custom"; public async Task ValidateAsync(ExtensionGrantValidationContext context) { var name = context.Request.Raw["name"]; var age = context.Request.Raw["age"]; // 创建无效授权的返回实例 var errorValidationResult = new GrantValidationResult(TokenRequestErrors.InvalidGrant); // 判断name参数与age参数是否为空 if (string.IsNullOrWhiteSpace(name) || string.IsNullOrWhiteSpace(age)) { // 赋予无效授权结果 context.Result = errorValidationResult; return; } if (name!="bob" && age!="19") { // 赋予无效授权结果 context.Result = errorValidationResult; return; } // 获取到有效的用户 subject_id var user = await _userManager.FindByNameAsync(name); // 返回有效结果 context.Result = new GrantValidationResult(user.Id, GrantType); } } ``` >### 在Startup.cs中实现自定义验证 ```csharp .AddExtensionGrantValidator<CustomAuthCodeValidator>() ``` ![](https://img.tnblog.net/arcimg/hb/484f69fdb9e74169921cb1cddb7acf01.png) >### 输入相对应的请求参数进行测试 ![](https://img.tnblog.net/arcimg/hb/52f4a1d628f4473f862264babb9485c1.png)