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


97

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

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


请,请参阅以下答案:stackoverflow.com/a/26453782/3290276添加声明确实成功了
Gabriela Macias 2015年

Answers:


149

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


1
看来,我们没有该物业。嗯 也许我们正在使用旧版本的WebApi。
Shaun Luttin 2014年

2
@ShaunLuttin好的,所以,如果您使用的是Web API 1,那么我相信ApiController上有Prinicpal属性。这只是访问Request.Properties集合的奇特包装。主要对象存储在该字典中。
Darrel Miller

6
只是不要忘记using Microsoft.AspNet.Identity;
霸王

1
@DarrelMiller有一种方法可以从代码的其他部分(不在控制器内)获取相同的内容(例如请求上下文)。
Ajay Aradhya

2
@AjayAradhya仅当您通过那里时。以前在Web框架上所做的努力表明,使用静态属性访问请求上下文会导致各种体系结构问题。起初很方便,但长期来看会造成很多痛苦。
Darrel Miller '18年

36

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

因此以下两个语句基本相同:

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

15
我正在尝试使用您在此处编写的内容,但GetUserId()函数始终返回null。用户已通过身份验证,我正在传递不记名令牌,并且ApiController具有[Authorize]标头
Joshua Ohana

仅当用户具有NameIdentifier声明时,GetUserId()函数才返回ID。有关如何解决此问题的示例,请在此处参考Oswaldo的答案:stackoverflow.com/questions/19505526
jramm

14

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

将此属性与getter定义为

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

并为了获得UserManager-在WebApi2中-做为罗马人(读作AccountController)

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

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


7

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

HttpContext.Current.Request.LogonUserIdentity.Name

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

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


6

Karan Bhandari的回答很好,但是添加到项目中的AccountController很可能是a Mvc.Controller。要转换他的答案用在ApiController变化HttpContext.Current.GetOwinContext()Request.GetOwinContext(),并确保你已经添加了以下2个using语句:

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


3

如果您使用的是Asp.Identity UseManager,它将自动设置

RequestContext.Principal.Identity.GetUserId()

根据IdentityUser您在创建使用IdentityDbContext

如果您要实现自定义用户表和owin令牌承载身份验证,请检查我的答案。

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

希望它仍然有帮助。:)


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

也可以看看:

如何从Web API操作中访问HTTPContext


5
不要使用HttpContext,因为它会限制您的托管选项,并使您的代码难以测试。
Darrel Miller 2014年

如果您是Self-host或OwinHttpListener托管,则HttpContext对象将不在字典中
Darrel Miller
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.