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

Sha*_*tin 90 c# asp.net asp.net-web-api asp.net-identity

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

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

Dar*_*ler 138

在WebApi 2中,您可以在ApiController上RequestContext.Principal的方法中使用

  • 只是不要忘记`使用Microsoft.AspNet.Identity;` (5认同)
  • @ShaunLuttin好的,所以如果您使用的是Web API 1,那么我相信ApiController上有一个Prinicpal属性.这只是一个关于访问Request.Properties集合的奇特包装器.主要对象存储在该字典中. (2认同)
  • @AjayAradhya仅当您通过那里时。以前在Web框架上所做的努力表明,使用静态属性访问请求上下文会导致各种体系结构问题。起初很方便,但长期来看会造成很多痛苦。 (2认同)

Pat*_*ick 36

您还可以使用该User属性访问主体ApiController.

所以以下两个语句基本相同:

string id;
id = User.Identity.GetUserId();
id = RequestContext.Principal.Identity.GetUserId();
Run Code Online (Sandbox Code Playgroud)

  • 我试图使用你在这里写的东西,但GetUserId()函数总是返回null.用户已被授权,我正在传递持有者令牌,而ApiController具有[Authorize]标头 (14认同)
  • 仅当用户具有 NameIdentifier 声明时,GetUserId() 函数才会返回 ID。有关如何解决此问题的示例,请参阅此处 Oswaldo 的答案:/sf/ask/1365386851/ (2认同)

小智 14

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

将此属性与getter定义为

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

并且为了获得UserManager - 在WebApi2 -do中作为Romans(读作AccountController)做

public ApplicationUserManager UserManager
        {
            get { return HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>(); }
        }
Run Code Online (Sandbox Code Playgroud)

这应该在IIS和自托管模式下兼容


小智 6

上面的建议对我都不起作用。以下做到了!

HttpContext.Current.Request.LogonUserIdentity.Name
Run Code Online (Sandbox Code Playgroud)

我想这里有各种各样的场景,这个场景对我有用。我的场景涉及一个在IIS下运行的AngularJS前端和一个Web API 2后端应用程序。我必须将两个应用程序都设置为在Windows身份验证下运行。

无需传递任何用户信息。浏览器和IIS交换登录的用户凭据,并且Web API可以按需访问用户凭据(我想是从IIS)。

  • 请注意,HttpContext.Current.Request.LogonUserIdentity 返回 WindowsIdentity。 (2认同)

小智 5

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

using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;
Run Code Online (Sandbox Code Playgroud)


Ven*_*ndi 5

在 .Net Core 中用于User.Identity.Name获取用户的 Name 声明。

  • `User.Identity.Name` 获取 [name](http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name) 声明的值。它不是特定于 Active Directory 的。 (2认同)