呼叫 Microsoft 身份驗證時無法獲取訪問令牌。我用登錄按鈕呼叫這個方法:
public ActionResult OauthRedirect()
{
var redirectUrl = "https://login.microsoftonline.com/common/oauth2/v2.0/authorize?"
"&scope=Calendars.ReadWrite offline_access User.Read"
"&response_type=code"
"&response_mode=query"
"&state=de-medewerker"
"&redirect_uri=https://localhost:44344/Admin/oauth/callback"
"&client_id=myClientID";
return Redirect(redirectUrl);
}
這是 OAuthController:
[Area("Admin")]
public class OAuthController : Controller
{
string tokensFile = "D:\\tokens.json";
public ActionResult Callback(string code,string state, string error)
{
if (!string.IsNullOrWhiteSpace(code))
{
RestClient restClient = new RestClient();
RestRequest restRequest = new RestRequest();
restRequest.AddParameter("client_id", "MyClientID");
restRequest.AddParameter("scope", "Calendars.ReadWrite offline_access User.Read");
restRequest.AddParameter("redirect_uri", "https://localhost:44344/Admin/oauth/callback");
restRequest.AddParameter("code", code);
restRequest.AddParameter("grant_type", "authorization_code");
restRequest.AddParameter("client_secret", "MyClientSecret");
restClient.BaseUrl = new Uri("https://login.microsoftonline.com/common/oauth2/v2.0/authorize?");
var response = restClient.Post(restRequest);
if (response.StatusCode==System.Net.HttpStatusCode.OK)
{
System.IO.File.WriteAllText(tokensFile, response.Content);
return RedirectToAction("Index", "Home");
}
}
return RedirectToAction("Error", "Home");
}
}
當我開始專案時,我在“response.Content”中得到一個 183 KB 的 HTML 格式字串,當我將 .json 更改為 .html 時,該字串保存在 tokens.json 檔案中,檔案內部是以下文本:
" 我們無法讓您登錄 您的瀏覽器當前設定為阻止 cookie。您需要允許 cookie 使用此服務。cookie 是存盤在您計算機上的小文本檔案,用于告訴我們您何時登錄。了解如何允許使用 cookie,請在您的網路瀏覽器中查看在線幫助。”
cookies 已禁用
但是我檢查了我的瀏覽器并且 cookie 沒有被禁用。
除錯影像
任何建議或幫助將不勝感激。
uj5u.com熱心網友回復:
令牌 API 端點是https://login.microsoftonline.com/common/oauth2/v2.0/token。
請將您的 BaseUrl 更新為https://login.microsoftonline.com/common/oauth2/v2.0/token而不是https://login.microsoftonline.com/common/oauth2/v2.0/authorize?
OAuth控制器:
[Area("Admin")]
public class OAuthController : Controller
{
string tokensFile = "D:\\tokens.json";
public ActionResult Callback(string code,string state, string error)
{
if (!string.IsNullOrWhiteSpace(code))
{
RestClient restClient = new RestClient();
RestRequest restRequest = new RestRequest();
restRequest.AddParameter("client_id", "MyClientID");
restRequest.AddParameter("scope", "Calendars.ReadWrite offline_access User.Read");
restRequest.AddParameter("redirect_uri", "https://localhost:44344/Admin/oauth/callback");
restRequest.AddParameter("code", code);
restRequest.AddParameter("grant_type", "authorization_code");
restRequest.AddParameter("client_secret", "MyClientSecret");
restClient.BaseUrl = new Uri("https://login.microsoftonline.com/common/oauth2/v2.0/token");
var response = restClient.Post(restRequest);
if (response.StatusCode==System.Net.HttpStatusCode.OK)
{
System.IO.File.WriteAllText(tokensFile, response.Content);
return RedirectToAction("Index", "Home");
}
}
return RedirectToAction("Error", "Home");
}
}
uj5u.com熱心網友回復:
在第二步中,您的 POST 應該是到令牌端點:
- /oauth2/v2.0/令牌
也將此內容型別標頭用于 POST 請求。我懷疑您將客戶端密碼作為 JSON 發送,這就是 Azure 沒有正確接收它的原因:
request.AddHeader("content-type", "application/x-www-form-urlencoded");
如果要像這樣回傳到客戶端,您的 OAuth 控制器還需要在重定向之前撰寫一個安全 cookie。使用內置的 OIDC 支持可能會使這更容易。
基本網址
還值得檢查您是否使用了正確的基本 URL。我的開發帳戶使用基于租戶的 URL:
https://login.microsoftonline.com/7f071fbc-8bf2-4e61-bb48-dabd8e2f5b5a/v2.0/.well-known/openid-configuration
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/384708.html
