asp.net-web-api – 如何在Web Api调用期间获取用户上下文?

前端之家收集整理的这篇文章主要介绍了asp.net-web-api – 如何在Web Api调用期间获取用户上下文?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个Web前端调用ASP Web Api 2后端.身份验证通过ASP身份进行管理.对于我创建的一些控制器,我需要知道拨打电话的用户.我不想创建一些奇怪的模型来传递,包括用户的身份(我甚至不存储在客户端).

对API的所有调用都使用承载令牌进行授权,我的想法是控制器应该能够基于此确定用户上下文,但我不知道如何实现.我已经搜索,但我不知道我正在寻找什么,没有发现任何相关.我要去像…

  1. public async Task<IHttpActionResult> Post(ApplicationIdentity identity,WalkthroughModel data)

更新

我发现下面看起来非常有希望,但价值永远是空的!我的控制器继承自ApiController并具有Authorize头.

  1. var userid = User.Identity.GetUserId();

更新2

我也尝试了所有的解决方案在Get the current user,within an ApiController action,without passing the userID as a parameter,但没有工作.无论我获得的身份是有效和auth’d,但是有一个空的UserID

更新3

这是我现在在哪里

  1. [Authorize]
  2. [Route("Email")]
  3. public async Task<IHttpActionResult> Get()
  4. {
  5. var testa = User.Identity.GetType();
  6. var testb = User.Identity.GetUserId();
  7. var testc = User.Identity.AuthenticationType;
  8. var testd = User.Identity.IsAuthenticated;
  9.  
  10.  
  11. return Ok();
  12. }

06003

用户显然已通过身份验证,但无法检索其用户ID.

更新4

我找到一个答案,但我真的不开心…

  1. ClaimsIdentity identity = (ClaimsIdentity)User.Identity;
  2. string username = identity.Claims.First().Value;

这让我的用户名没有任何数据库调用,但它似乎非常janky,并支持将来的痛苦.如果有人有更好的答案,会爱上

如果我需要改变道路上发出的索赔怎么办?加上任何时候,我实际上需要用户的id,我必须进行一个数据库调用来将用户名转换为ID

解决方法

一个常见的方法是为您的ApiControllers创建一个基类,并利用ApplicationUserManager来检索所需的信息.通过这种方法,您可以保留在一个位置访问用户信息的逻辑,并在控制器中重用它们.
  1. public class BaseApiController : ApiController
  2. {
  3. private ApplicationUser _member;
  4.  
  5. public ApplicationUserManager UserManager
  6. {
  7. get { return HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>(); }
  8. }
  9.  
  10. public string UserIdentityId
  11. {
  12. get
  13. {
  14. var user = UserManager.FindByName(User.Identity.Name);
  15. return user.Id;
  16. }
  17. }
  18.  
  19. public ApplicationUser UserRecord
  20. {
  21. get
  22. {
  23. if (_member != null)
  24. {
  25. return _member ;
  26. }
  27. _member = UserManager.FindByEmail(Thread.CurrentPrincipal.Identity.Name);
  28. return _member ;
  29. }
  30. set { _member = value; }
  31. }
  32. }

猜你在找的asp.Net相关文章