短篇故事
我有一個 Web API。我想防止未經授權的請求,所以我將[Authorize(Roles = "admin")]屬性添加到我的ApiController.
如何從 C# 中的不同應用程式(例如從桌面應用程式)向我自己的 API 發出請求?
很長的故事
我有一個簡單的 Web 應用程式解決方案,其中包含 2 個專案。
用戶可以通過project1用戶名和密碼登錄并執行操作。簽署用戶的代碼如下所示:
if (ModelState.IsValid)
{
var user = await _userManager.GetFromModelAsync(model); // just get user from DB
var claims = new List<Claim>
{
new Claim(ClaimsIdentity.DefaultNameClaimType, user.Code),
new Claim(ClaimsIdentity.DefaultRoleClaimType, user.Role?.Name)
};
var id = new ClaimsIdentity(
claims, "ApplicationCookie",
ClaimsIdentity.DefaultNameClaimType,
ClaimsIdentity.DefaultRoleClaimType);
await _httpContextAccessor.HttpContext.SignInAsync(
CookieAuthenticationDefaults.AuthenticationScheme,
new ClaimsPrincipal(id)); // I use httpContextAccessor cause I have this code not in controller
}
通過此身份驗證,用戶可以輕松訪問具有屬性的任何控制器[Authorize(Roles = "user")]。
在Project2中,我有 Admin Web API,它可以更改用戶所做的事情。我想從桌面 C# 應用程式呼叫此 API,并且我還希望該 API 具有授權要求([Authorize(Roles = "admin")]在我的情況下)。
例如,它看起來像這樣:
[Authorize(Roles = "user")]
public class AdminApiController : Controller
{
public async Task<IActionResult> Index()
{
return Ok("Ok");
}
}
問題是:有了這樣的身份驗證機制,我應該如何向這樣的 API 發出 HTTP 請求HttpClient?我知道的唯一方法是使用特殊授權表格WebClient并模擬授權。UploadValues
PS 我嘗試設定 HTTPAuthorization標頭,但沒有成功。也許重點是為用戶和管理員使用單獨的身份驗證機制?
對此的任何幫助都將受到高度贊賞。
uj5u.com熱心網友回復:
我認為您可以遵循身份驗證機制JWT(JSON web Token)而不是 cookie,因為桌面應用程式是不使用 Web 瀏覽器的不同環境
用戶認證場景
- 桌面應用程式通過用戶名和密碼引數登錄到 Web API
- 如果通過,則為經過身份驗證的用戶生成一個令牌并作為回應回傳它
- 當桌面應用點擊通過令牌授權角色修飾的 API 操作時
有關完整示例,請查看此Url
這是桌面應用程式中的示例代碼:
using Newtonsoft.Json;
...
var client = new HttpClient();
var httpRequestMessage = new HttpRequestMessage
{
Method = HttpMethod.Post,
RequestUri = new Uri("https://api.domain.com/action"),
Headers = {
{ HttpRequestHeader.Authorization.ToString(), "Bearer xxxxxxxxxxxxxxxxxxx" },
{ HttpRequestHeader.Accept.ToString(), "application/json" },
{ "X-Version", "1" }
},
Content = new StringContent(JsonConvert.SerializeObject(svm))
};
var response = client.SendAsync(httpRequestMessage).Result;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/463600.html
上一篇:如何逐行制作燒瓶流輸出?
下一篇:Jetty請求屬性未跨服務傳播
