不支持的授权类型与IdentityServer 3与CustomGrantValidator

问题描述:

我想设置我们的IdentityServer解决方案来接受自定义格兰特验证。我们的API项目可以通过UI访问,一个使用密码认证(正在工作),另一个使用第三方认证。不支持的授权类型与IdentityServer 3与CustomGrantValidator

在我们的API我已经设置了IdentityServer像这样:

Startup.cs

public void Configuration(IAppBuilder app) 
    { 
     var factory = new IdentityServerServiceFactory() 
      .UseInMemoryClients(Clients.Get()) 
      .UseInMemoryScopes(Scopes.Get()); 

     var userService = new IdentityUserService(); 
     factory.UserService = new Registration<IUserService>(resolver => userService); 
     factory.CustomGrantValidators.Add(
      new Registration<ICustomGrantValidator, MyGrantValidator>()); 

     var options = new IdentityServerOptions 
     { 
      SiteName = "My App Name", 
      SigningCertificate = Certificate.Get(), 
      Factory = factory 
     }; 

     app.Map("/identity", identityServerApp => 
     { 
      identityServerApp.UseIdentityServer(options); 
     }); 
} 

MyGrantValidator.cs:

public class MyGrantValidator : ICustomGrantValidator 
{ 
    public async Task<CustomGrantValidationResult> ValidateAsync(ValidatedTokenRequest request) 
    { 
     // For now I just want a basic response. More logic will come later. 
     var authResult = new AuthenticateResult(
      subject: "1234", // user.AccountId.ToString(), 
      name: "bob" //context.UserName 
     ); 
     var grantResult = new CustomGrantValidationResult 
     { 
      IsError = authResult.IsError, 
      Error = authResult.ErrorMessage, 
      ErrorDescription = authResult.ErrorMessage, 
      Principal = authResult.User 
     }; 
     return await Task.FromResult(grantResult); 
    } 

    public string GrantType => "myGrantType"; 
} 

在我的UI,我安装一个客户端像这个:

 var owinContext = HttpContext.GetOwinContext(); 
     var token = owinContext.Authentication.User.FindFirst(c => c.Type == "myToken")?.Value; 
     var tokenId = owinContext.Authentication.User.FindFirst(c => c.Type == ClaimTypes.Sid)?.Value; 

     var client = new TokenClient(
      ConfigurationManager.AppSettings["IdentityServerBaseUrl"] + "/connect/token", 
      "MyUser", 
      ConfigurationManager.AppSettings["MyClientSecret"], 
      AuthenticationStyle.Custom 
     );    

     var tokenResponse = client.RequestCustomGrantAsync(
      "myGrantType", 
      "read write", 
      new Dictionary<string, string> 
      { 
       { "token", token }, 
       { "tokenId", tokenId } 
      } 
     ).Result; 

     return Redirect(returnUrl); 

当请求被触发时,我得到:unsupported_grant_type

我错过了什么?

您正在使用名为“MyUser”的客户端(客户端的名称很奇怪,但确定)。该客户是否被注册为授权类型设置为“自定义”的内存中客户之一?