oauth2身份验证c#代码不工作

oauth2身份验证c#代码不工作,c#,oauth,oauth-2.0,dotnetopenauth,C#,Oauth,Oauth 2.0,Dotnetopenauth,我正在尝试使用auth代码使用OAuth2API。在第一步中,我通过提供客户端id和密码来接收身份验证,现在在第二步中,我需要使用该身份验证代码的访问令牌。 我试过低于c代码 作为回应,我得到了 OAuth 2.0客户端支持客户端身份验证方法“Client\u secret\u basic”,但请求了方法“Client\u secret\u post”。您必须配置OAuth 2.0客户端的“token\u endpoint\u auth\u method”值以接受“client\u secret

我正在尝试使用auth代码使用OAuth2API。在第一步中,我通过提供客户端id和密码来接收身份验证,现在在第二步中,我需要使用该身份验证代码的访问令牌。 我试过低于c代码

作为回应,我得到了

OAuth 2.0客户端支持客户端身份验证方法“Client\u secret\u basic”,但请求了方法“Client\u secret\u post”。您必须配置OAuth 2.0客户端的“token\u endpoint\u auth\u method”值以接受“client\u secret\u post”


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

首先,当您使用C时,我建议您使用与任何OAuth2授权服务器或OpenId连接提供程序交互

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

要能够使用
令牌
端点请求新的
访问令牌
,客户端必须能够首先通过提供
客户端id
客户端密码
(如客户端的用户和密码)来证明其身份

提供此客户端凭据有两种方法,分别是:

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

您可以将客户端id/密码组合作为帖子正文的一部分发送:

POST /connect/token
client_id=client1& client_secret=secret& ...
..或作为基本身份验证标头:

POST /connect/token
Authorization: Basic xxxxx
在这种情况下,错误响应表示只允许这些方法中的一种,即身份验证头

因此,不要在请求正文中传递您的客户id和客户机密:

request1.AddParameter("client_id", "MM01418");
request1.AddParameter("client_secret", "xxxxxxxxxxxxxx");
您需要使用collon作为分隔符(如“MM01418:xxxxxxxxxxxxxx”)来表示客户id和客户机密,并应用base64编码。然后将其作为标题添加到请求中,格式为
Authorization:Basic tu0wmtqxodp4ehh4ehh4ehh4
。您可以使用以下代码在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这样的库,该库根据具体情况为您实现正确的请求。

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

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

要能够使用
令牌
端点请求新的
访问令牌
,客户端必须能够首先通过提供
客户端id
客户端密码
(如客户端的用户和密码)来证明其身份

提供此客户端凭据有两种方法,分别是:

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

您可以将客户端id/密码组合作为帖子正文的一部分发送:

POST /connect/token
client_id=client1& client_secret=secret& ...
..或作为基本身份验证标头:

POST /connect/token
Authorization: Basic xxxxx
在这种情况下,错误响应表示只允许这些方法中的一种,即身份验证头

因此,不要在请求正文中传递您的客户id和客户机密:

request1.AddParameter("client_id", "MM01418");
request1.AddParameter("client_secret", "xxxxxxxxxxxxxx");
您需要使用collon作为分隔符(如“MM01418:xxxxxxxxxxxxxx”)来表示客户id和客户机密,并应用base64编码。然后将其作为标题添加到请求中,格式为
Authorization:Basic tu0wmtqxodp4ehh4ehh4ehh4
。您可以使用以下代码在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,该库根据具体情况为您实现正确的请求