在ApiController操作中获取当前用户,而不传递用户ID作为参数

我们如何在安全的ApiController操作中获取当前用户,而不传递userName或userId作为参数?

我们认为这是可用的,因为我们在一个安全的行动。 处于安全行动意味着用户已经通过身份validation,并且请求具有她的不记名令牌。 鉴于WebApi已授权用户,可能有内置的方式来访问userId,而不必将其作为操作parameter passing。

在WebApi 2中,你可以在ApiController的一个方法中使用RequestContext.Principal

您也可以使用ApiController上的User属性来访问主体。

所以下面的两个陈述基本上是一样的:

 string id; id = User.Identity.GetUserId(); id = RequestContext.Principal.Identity.GetUserId(); 

提示在于Webapi2自动生成的帐户控制器

将getter的属性定义为

 public string UserIdentity { get { var user = UserManager.FindByName(User.Identity.Name); return user;//user.Email } } 

并且为了得到UserManager – 在WebApi2中像Romans(读为AccountController)那样做

 public ApplicationUserManager UserManager { get { return HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>(); } } 

这应该在IIS和自我主机模式下兼容

Karan Bhandari的回答很好,但是在一个项目中添加的AccountController很可能是一个Mvc.Controller 。 要将其答案转换为在ApiController中使用,请将HttpContext.Current.GetOwinContext()更改为Request.GetOwinContext() ,并确保已添加以下2条using语句:

 using Microsoft.AspNet.Identity; using Microsoft.AspNet.Identity.Owin; 

在.Net核心使用User.Identity.Name获取用户的名称声明。

如果您使用Asp.Identity UseManager,它会自动设置值

RequestContext.Principal.Identity.GetUserId()

基于您在创buildIdentityDbContext中使用的IdentityUser

如果您正在实施自定义用户表和owin令牌承载身份validation,请检查我的答案。

如何在Web Api调用期间获取用户上下文?

希望它仍然有帮助。 🙂

上面的build议没有为我工作。 下面做了!

 HttpContext.Current.Request.LogonUserIdentity.Name 

我想有很多不同的场景,这个为我工作。 我的场景涉及一个AngularJS前端和一个Web API 2后端应用程序,都在IIS下运行。 我必须将这两个应用程序都设置为在Windows身份validation下运行。

无需传递任何用户信息。 浏览器和IIS交换login的用户凭据,并且Web API可以根据需要访问用户凭据(从IIS我推测)。

 string userName; string userId; if (HttpContext.Current != null && HttpContext.Current.User != null && HttpContext.Current.User.Identity.Name != null) { userName = HttpContext.Current.User.Identity.Name; userId = HttpContext.Current.User.Identity.GetUserId(); } 

或者基于Darrel Miller的评论,也许可以先用它来检索HttpContext。

 // get httpContext object httpContext; actionContext.Request.Properties.TryGetValue("MS_HttpContext", out httpContext); 

也可以看看:

如何从Web API操作中访问HTTPContext

如果使用Windows Active Directory,则可以添加

  using System.DirectoryServices.AccountManagement 

并在api方法中,得到这样的全名:

var fullName = UserPrincipal.Current.DisplayName;