Flurl 调用 IdentityServer4

Flurl calling IdentityServer4

我正在尝试使用 Flurl 调用 Identity Server 4

我从 ID 服务器返回 400。 当我使用 PostMan 或 IdentityModel.Client.

中可用的方法进行调用时,凭证等工作

我不确定 Post 即 PostUrlEncodedAsync 如您所见,我尝试了各种组合。

这..不起作用

var address = "http://localhost:8027/connect/token";
var x = await address
.WithBasicAuth("clientName", "secretValue")
.SetQueryParams(
    new
    {
        GrantType = "client_credentials",
        Scope = "requiredScope"
    }
)
.PostUrlEncodedAsync(new { });
//.SendAsync(HttpMethod.Post, null, CancellationToken.None);
//.SendAsync(HttpMethod.Post, y);

这..确实如此

var apiClientCredentials = new ClientCredentialsTokenRequest()
{
    Address = "http://localhost:8027/connect/token",

    ClientId = "clientName",
    ClientSecret = "secretValue",
    Scope = "requiredScope"
};

var client = new HttpClient();

var tokenResponse = await client.RequestClientCredentialsTokenAsync(apiClientCredentials);
if (tokenResponse.IsError)
{
}

我可以看到 'RequestClientCredentialsTokenAsync' 内部的深层操作确实 parameters.Add 添加了授权类型和范围,因此我将它们添加为参数。

还尝试将客户端 ID 和密码添加到查询参数中。

相同的 400 条消息。

非常感谢任何帮助。

我认为不同之处在于 IdentityModel 知道将 ClientCredentialsTokenRequest 属性 名称(如 ClientIdGrantType 序列化为蛇形,即 client_idgrant_type,根据 OAuth2 的要求。当您将匿名对象交给 Flurl 时,它只会按原样序列化 属性 名称。要使其与 Flurl 一起工作,您可以创建一个 class 并用 Json.NET serialization attributes 装饰它,或者(我通常做的)保持简单,随意使用 C# 属性 名称约定:

.SetQueryParams(
    new
    {
        grant_type = "client_credentials",
        scope = "requiredScope"
    }