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

时间:2014-02-07 00:23:12

标签: c# asp.net asp.net-web-api asp.net-identity

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

我们假设这是可用的,因为我们处于安全行动中。处于安全行动意味着用户已经过身份验证,并且请求具有她的承载令牌。鉴于WebApi已授权用户,可能有一种内置方式来访问userId,而不必将其作为操作参数传递。

8 个答案:

答案 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);    

另见:

How to access HTTPContext from within your Web API action