2016-02-29 50 views
1

问题Identity.GetUserId()如何找到用户标识?

User.Identity.GetUserId()如何找到当前用户的ID?

它是否从Cookie中找到用户标识,还是查询数据库?或者其他方法?

问题

出于某种原因,User.Identity.GetUserId()回报null当我添加一个有效Bearer Token我的HTTP请求头和请求发送到我的控制器的端点:

// MVC Controller Action Method 

[Authorize] 
public HttpResponseMessage(UserInfoViewModel model) 
{ 
    // Request passes the Authorization filter since a valid oauth token 
    // is attached to the request header. 

    string userId = User.Identity.GetUserId(); 

    // However, userId is null! 

    // Other stuff... 
} 
+0

你使用什么验证方法?它可以是匿名认证? – enkryptor

回答

3

当用户登录到您的应用程序时,服务器使用ASP.NET身份验证您的用户使用数据库并创建返回到UI的有效令牌。此令牌在其到期时有效,并具有验证和授权用户所需的所有信息,包括用户的ID。接下来从客户端到服务器端的调用必须在http请求头中使用此令牌完成,但服务器不会再次调用数据库,因为ASP.NET身份知道如何解密令牌并获取用户的所有信息。

Cookie的使用只是将令牌存储在客户端的一种方式。正如我上面评论的那样,您必须在登录后的下一个请求中发送令牌,以便您可以将此令牌存储在Cookie中或存储在浏览器中的会话存储中。

1

首先,确保你'不允许未经过身份验证的用户。

之后,你想解析承载令牌,你必须配置它。

你会需要这个包在启动时Microsoft.Owin.Security.OAuth

如果必须配置ASP.NET身份使用承载认证与:

app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions { 
    // your options; 
}); 

也许您StartupAuth.cs文件

2

User.Identity.GetUserId()如何找到当前用户的ID?

ClaimTypes.NameIdentifier是由函数User.Identity.GetUserId()

您将需要添加的要求在您的授权代码中使用的要求,

identity.AddClaim(ClaimTypes.NameIdentifier, user.Id); 

身份类型ClaimIdentity。