扩展授权-无效的授权类型委托-Identity Server 4 .NET Core 2.2

4

我正在尝试通过遵循此处的教程,在使用客户端凭据的情况下实现委托授权。由于我有一个API1资源调用另一个API2资源,因此该教程只有一页。

我已经实现了IExtensionGrantValidator并复制了来自文档的代码,使用它们提供的类名,并添加了授予类型为委派客户端。 但是,我不确定在哪里以及如何调用下面的方法。起初,我从客户端中调用它,并尝试将最初获得的调用API1的JWT传递给DelegateAsync方法,但是一直收到错误请求

在API 1中,您现在可以自己构造HTTP负载,或者使用IdentityModel助手库:

    public async Task<TokenResponse> DelegateAsync(string userToken)
    {
        var payload = new
        {
            token = userToken
        };

        // create token client
        var client = new TokenClient(disco.TokenEndpoint, "api1.client", "secret");

        // send custom grant to token endpoint, return response
        return await client.RequestCustomGrantAsync("delegation", "api2", payload);
    }

因此,我尝试从API1请求一个令牌,在一个名为GetAPI2Response的方法中,该方法试图调用API2中的一个方法:

        [HttpGet]
        [Route("getapi2response")]
        public async Task<string> GetApi2Response()
        {
            var client = new HttpClient();

            var tokenResponse = await client.RequestTokenAsync(new TokenRequest
            {
                Address = "http://localhost:5005/connect/token",
                GrantType = "delegation",
                ClientId = "api1_client",
                ClientSecret = "74c4148e-70f4-4fd9-b444-03002b177937",

                Parameters = { { "scope", "stateapi" } }
            });

            var apiClient = new HttpClient();
            apiClient.SetBearerToken(tokenResponse.AccessToken);

            var response = await apiClient.GetAsync("http://localhost:6050/api/values");

            if (!response.IsSuccessStatusCode)
            {
                Debug.WriteLine(response.StatusCode);
            }
            else
            {
                var content = await response.Content.ReadAsStringAsync();

                return content;
            }
            return "failed";
        }

然而,在调试时返回的是“无效授权类型(invalid grant type)”错误。奇怪的是,当运行IDSRV时,IExtensionGrantValidator方法中的代码直到单击discovery docs链接后才被触发,然后它会显示为一个grant type
显然我做错了什么,因为我没有包括文档中提到的DelegateAsync 方法,而它不清楚应该放在哪里。
1个回答

3
文档似乎有点过时了。使用实际的扩展方法,必须有类似以下内容的东西:
var tokenResponse = await client.RequestTokenAsync(new TokenRequest
{
    Address = "http://localhost:5005/connect/token",
    GrantType = "delegation",
    ClientId = "api1_client",
    ClientSecret = "74c4148e-70f4-4fd9-b444-03002b177937",
    Parameters = new Dictionary<string, string>{{ "token", userToken }, { "scope", "stateapi" } }
})

您已经实现了它,但忘记添加初始令牌。当您从GetApi2Response()中提取它时,它可以变成您的DelegateAsync

然后在Identityserver中,您的客户端配置必须包含api1_client委托授权类型。同时不要忘记注册:

services.AddIdentityServer().AddExtensionGrantValidator<YourIExtensionGrantValidatorImpl>()

评论不适合进行长时间的讨论;此对话已被移至聊天室 - Samuel Liew
嗨d_f,你从哪里获取userToken?我无法想象如何获得它。 - Jose L. Garcia
@JoseL.Garcia 那个 userToken 只是请求“api1”时携带的原始访问令牌。它是请求的 Authorization 标头中的第二个单词(第一个单词始终为 bearer)。 - d_f
很遗憾,我与 @d_f 的聊天记录已经不存在了,但是我记得从 HttpContext 获取了原始访问令牌用于调用我们已经移动到聊天中的第二个 API。 - user1574598

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接