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

时间:2019-06-11 15:18:09

标签: c# oauth oauth-2.0 dotnetopenauth

我正在尝试使用身份验证代码使用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

尝试了很多但无法解决。

1 个答案:

答案 0 :(得分:3)

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

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

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

IdentityServer4 documentation about secrets起,有两种方法可提供此客户端凭据:

  

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

     

您可以将客户端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");

您需要使用冒号作为分隔符(例如“ MM01418:xxxxxxxxxxxxxxxx”)连接client_id和client_secret并应用base64编码。然后将其作为标头添加到您的请求中,格式为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);

或将此低级详细信息留给 IdentityModel Nuget Docs之类的库,该库将根据情况为您实现正确的请求。