Asp.net-Web-Api
如何在 Web Api 呼叫期間獲取使用者上下文?
我有一個呼叫 ASP Web Api 2 後端的 Web 前端。身份驗證由 ASP 身份管理。對於我正在創建的一些控制器,我需要知道撥打電話的使用者。我不想創建一些奇怪的模型來傳遞,包括使用者的身份(我什至不儲存在客戶端中)。
所有對 API 的呼叫都使用不記名令牌授權,我的想法是控制器應該能夠基於此確定使用者上下文,但我不知道如何實現。我已經搜尋過,但我不知道我在搜尋什麼,也沒有找到任何相關的東西。我要去類似的東西…
public async Task<IHttpActionResult> Post(ApplicationIdentity identity, WalkthroughModel data)更新
我發現下面看起來很有希望……但該值始終為空!我的控制器繼承自 ApiController 並具有 Authorize 標頭。
var userid = User.Identity.GetUserId();更新 2
我還嘗試了在ApiController 操作中獲取目前使用者中的所有解決方案,但沒有將使用者 ID 作為參數傳遞,但沒有任何效果。無論我得到一個有效且經過身份驗證的身份,但使用者 ID 為空
更新 3
這就是我現在的位置。
[Authorize] [Route("Email")] public async Task<IHttpActionResult> Get() { var testa = User.Identity.GetType(); var testb = User.Identity.GetUserId(); var testc = User.Identity.AuthenticationType; var testd = User.Identity.IsAuthenticated; return Ok(); }testa = Name: ClaimsIdentity, testb = null, testc = Bearer, testd = true使用者顯然已經過身份驗證,但我無法檢索他們的使用者 ID。
更新 4
我找到了答案,但我真的很不滿意……
ClaimsIdentity identity = (ClaimsIdentity)User.Identity; string username = identity.Claims.First().Value;這讓我在沒有任何數據庫呼叫的情況下獲得了使用者名,但它看起來很笨拙,並且在未來支持起來很痛苦。如果有人有更好的答案,我會很高興。
如果我需要更改以後發出的索賠怎麼辦?另外,任何時候我實際上需要使用者的 ID,我都必須進行 db 呼叫以將使用者名轉換為 ID
一種常見的方法是為您的 ApiControllers 創建一個基類,並利用 ApplicationUserManager 來檢索您需要的資訊。使用這種方法,您可以將訪問使用者資訊的邏輯保留在一個位置,並在您的控制器中重複使用。
public class BaseApiController : ApiController { private ApplicationUser _member; public ApplicationUserManager UserManager { get { return HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>(); } } public string UserIdentityId { get { var user = UserManager.FindByName(User.Identity.Name); return user.Id; } } public ApplicationUser UserRecord { get { if (_member != null) { return _member ; } _member = UserManager.FindByEmail(Thread.CurrentPrincipal.Identity.Name); return _member ; } set { _member = value; } } }