Asp.net-Web-Api

如何在 Web Api 呼叫期間獲取使用者上下文?

  • September 1, 2016

我有一個呼叫 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; }
       }
}

引用自:https://stackoverflow.com/questions/28657852