我有一个Web前端调用ASP Web Api 2后端.身份验证通过ASP身份进行管理.对于我创建的一些控制器,我需要知道拨打电话的用户.我不想创建一些奇怪的模型来传递,包括用户的身份(我甚至不存储在客户端).
对API的所有调用都使用承载令牌进行授权,我的想法是控制器应该能够基于此确定用户上下文,但我不知道如何实现.我已经搜索,但我不知道我正在寻找什么,没有发现任何相关.我要去像…
public async Task<IHttpActionResult> Post(ApplicationIdentity identity,WalkthroughModel data)
更新
我发现下面看起来非常有希望,但价值永远是空的!我的控制器继承自ApiController并具有Authorize头.
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
这是我现在在哪里
[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(); }
06003
更新4
我找到一个答案,但我真的不开心…
ClaimsIdentity identity = (ClaimsIdentity)User.Identity; string username = identity.Claims.First().Value;
这让我的用户名没有任何数据库调用,但它似乎非常janky,并支持将来的痛苦.如果有人有更好的答案,会爱上
如果我需要改变道路上发出的索赔怎么办?加上任何时候,我实际上需要用户的id,我必须进行一个数据库调用来将用户名转换为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; } } }