如何在安全的ApiController操作中获取当前用户,而不将userName或userId作为参数传递?
我们假设这是可用的,因为我们处于安全行动中。处于安全行动意味着用户已经过身份验证,并且请求具有她的承载令牌。鉴于WebApi已授权用户,可能有一种内置方式来访问userId,而不必将其作为操作参数传递。
答案 0 :(得分:129)
在Web Api 2中,您可以在ApiController
中的方法中使用RequestContext.Principal
答案 1 :(得分:34)
您还可以使用User
上的ApiController
属性访问该主体。
所以以下两个陈述基本相同:
string id;
id = User.Identity.GetUserId();
id = RequestContext.Principal.Identity.GetUserId();
答案 2 :(得分:14)
提示位于Webapi2自动生成的帐户控制器
将此属性与getter定义为
public string UserIdentity
{
get
{
var user = UserManager.FindByName(User.Identity.Name);
return user;//user.Email
}
}
并且为了获得UserManager - 在WebApi2 -do中作为Romans(读作AccountController)做
public ApplicationUserManager UserManager
{
get { return HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>(); }
}
这应该在IIS和自托管模式下兼容
答案 3 :(得分:5)
Karan Bhandari的答案很好,但在项目中添加的AccountController很可能是<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
。要将其答案转换为在ApiController中使用,请将Mvc.Controller
更改为HttpContext.Current.GetOwinContext()
,并确保添加了以下2 Request.GetOwinContext()
个语句:
using
答案 4 :(得分:4)
上述建议均不适合我。以下做了!
HttpContext.Current.Request.LogonUserIdentity.Name
我想有各种各样的场景,这个对我有用。我的方案涉及一个AngularJS前端和一个Web API 2后端应用程序,它们都在IIS下运行。我必须将两个应用程序设置为在Windows身份验证下运行完全。
无需传递任何用户信息。浏览器和IIS交换登录的用户凭据,Web API可以根据需要访问用户凭据(来自IIS我认为)。
答案 5 :(得分:4)
在.Net Core中使用User.Identity.Name
获取用户的姓名声明。
答案 6 :(得分:2)
如果您使用的是Asp.Identity UseManager,它会自动设置
的值RequestContext.Principal.Identity.GetUserId()
基于 IdentityUser ,用于创建 IdentityDbContext 。
如果您正在实施自定义用户表并进行令牌承载身份验证,请检查我的答案。
How to get user context during Web Api calls?
希望它仍然有帮助。 :)
答案 7 :(得分:1)
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);
另见: