簡體   English   中英

oauth2 身份驗證 C# 代碼不起作用

[英]oauth2 authentication c# code is not working

我正在嘗試使用身份驗證代碼使用 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 文檔中關於 secrets 的信息

使用共享密鑰進行身份驗證

您可以將客戶端 ID/秘密組合作為 POST 正文的一部分發送:

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

..或作為基本身份驗證標頭:

 POST /connect/token Authorization: Basic xxxxx

在這種情況下,錯誤響應表示只允許使用其中一種方法,即Authentication 標頭

因此,不要在請求正文中傳遞您的 client_id 和 client_secret:

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

您需要使用冒號作為分隔符連接 client_id 和 client_secret,例如“MM01418:xxxxxxxxxxxxxxxx”並應用 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這樣的庫,它根據情況為您實現正確的請求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM