带有 IdentityServer 3 的 CustomGrantValidator 不支持的授权类型

Unsupported Grant Type with CustomGrantValidator with IdentityServer 3

我正在尝试设置我们的 IdentityServer 解决方案以接受自定义授权验证程序。我们的 API 项目由 UIs 访问,一个使用密码身份验证(正在运行),现在一个将使用第 3 方身份验证。

在我们的 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" 的客户端(客户端的名称很奇怪,但没关系)。该客户端是否已注册为授权类型设置为 "custom" 的内存中客户端之一?