我有一个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; }
- }
- }