OAuth2 身份验证 C# 代码不起作用



我正在尝试使用身份验证代码使用 oauth2 api。第一步,我通过提供客户端 ID 和密钥获得了身份验证,现在在第二步中,我需要使用该身份验证代码的访问令牌。 我尝试了下面的 c# 代码

var client1 = new RestClient("https://ant.aliceblueonline.com/oauth2/token");
var request1 = new RestRequest(Method.POST);
request1.AddHeader("Content-Type", "application/x-www-form-urlencoded");
request1.AddParameter("code", "xxxxxxxxxxxxxxxxx");
request1.AddParameter("grant_type", "authorization_code");
request1.AddParameter("redirect_uri", "https://ant.aliceblueonline.com/plugin/callback");
request1.AddParameter("client_id", "MM01418");
request1.AddParameter("client_secret", "xxxxxxxxxxxxxx");
IRestResponse response = client1.Execute(request1);

作为回应,我得到

OAuth 2.0 客户端支持客户端身份验证方法"client_secret_basic",但请求了方法"client_secret_post"。您必须将 OAuth 2.0 客户端的"token_endpoint_auth_method"值配置为接受"client_secret_post

尝试了很多,但无法解决。

首先,当您使用 C# 时,我建议您使用 IdentityModel 与任何 OAuth2 授权服务器或 OpenId Connect 提供程序进行交互。

让我们从客户端的定义开始:客户端是允许代表用户请求访问令牌的应用程序。在您的示例中,运行您发布的代码的服务器是客户端。

为了能够使用token终结点请求新access_token客户端必须能够首先通过提供client_idclient_secret(如客户端的用户和密码)来证明其身份。

提供此客户端凭据的方法有两种,分别来自有关机密的 IdentityServer4 文档:

使用共享密钥进行身份验证

您可以将客户端 ID/密钥组合作为 POST 正文的一部分发送:

POST /connect/token
client_id=client1& client_secret=secret& ...

..或作为基本身份验证标头:

POST /connect/token
Authorization: Basic xxxxx

在这种情况下,错误响应说只允许其中一种方法,即身份验证标头

因此,不要沿请求正文传递client_id和client_secret:

request1.AddParameter("client_id", "MM01418");
request1.AddParameter("client_secret", "xxxxxxxxxxxxxx");

您需要用冒号连接client_id和client_secret作为分隔符,如"MM01418:xxx然后将其作为标题添加到您的请求中,形式为Authorization: Basic TU0wMTQxODp4eHh4eHh4eHh4eHh4eHh4.可以使用以下代码在 c# 中执行此操作:

var credentials = string.Format("{0}:{1}", clientId, clientSecret);
var headerValue = Convert.ToBase64String(Encoding.UTF8.GetBytes(credentials));
var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", headerValue);

或者将此低级别详细信息留给IdentityModelNuget Docs 等库,该库会根据情况为你实现正确的请求。

最新更新