如何在 Identity 3.0 中获取当前的 UserId? User.GetUserId returns 空
How to get current UserId in Identity 3.0? User.GetUserId returns null
我需要获取发出某些请求的用户的 ID。
在之前版本的 Identity 中,我可以这样做:
User.Identity.GetUserId();
不过好像已经下架了
还有类似的东西:
User.GetUserId();
但它始终 returns 为空,即使 User.Identity.IsAuthenticated 为真并且 User.Identity.Name 设置正确。
我应该用什么来做?
编辑:
我的认证逻辑是基于[default Visual Studio 2015 template],到目前为止我在身份方面没有太大改变,所以如果你想检查它是如何完成的,你可以简单地在github link上看到它我贴了。
我认为在以前的版本中有一个内置的扩展方法,但他们删除了它。您可以实现自己的替换它:
using System;
using System.Security.Claims;
using Microsoft.AspNet.Identity;
namespace cloudscribe.Core.Identity
{
public static class ClaimsPrincipalExtensions
{
public static string GetUserId(this ClaimsPrincipal principal)
{
if (principal == null)
{
throw new ArgumentNullException(nameof(principal));
}
var claim = principal.FindFirst(ClaimTypes.NameIdentifier);
return claim != null ? claim.Value : null;
}
}
}
ClaimType.NameIdentifier 应映射到用户 ID
User.Identity.GetUserId();
在继承 Page
的 class 中可用。
您也可以使用
User.Identity.Name;
有关详细信息,请访问 MSDN
https://msdn.microsoft.com/en-us/library/system.security.principal.windowsidentity(v=vs.110).aspx
根据我们的讨论,您的用户身份似乎不包含 User.GetUserId() 使用的正确声明。
您可以通过以下方式手动设置 NameIdentifier 声明:
// ClaimsIdentity identity = new ClaimsIdentity...
identity.AddClaim(ClaimTypes.NameIdentifier, user.Id);
@Joe Audette
原来是搬家了
User.GetUserId => UserManager.GetUserId(User)
User.GetUserName => UserManager.GetUserName(User)
User.IsSignedIn => SignInManager.IsSignedIn(User)
我的目标是在自定义中间件中检索 UserId 这是我使用的:
httpContext.User.Identity.IsAuthenticated ?
httpContext.User.Claims.Where(c => c.Type == ClaimTypes.NameIdentifier).First().Value
: Guid.Empty.ToString()
我需要获取发出某些请求的用户的 ID。 在之前版本的 Identity 中,我可以这样做:
User.Identity.GetUserId();
不过好像已经下架了
还有类似的东西:
User.GetUserId();
但它始终 returns 为空,即使 User.Identity.IsAuthenticated 为真并且 User.Identity.Name 设置正确。
我应该用什么来做?
编辑: 我的认证逻辑是基于[default Visual Studio 2015 template],到目前为止我在身份方面没有太大改变,所以如果你想检查它是如何完成的,你可以简单地在github link上看到它我贴了。
我认为在以前的版本中有一个内置的扩展方法,但他们删除了它。您可以实现自己的替换它:
using System;
using System.Security.Claims;
using Microsoft.AspNet.Identity;
namespace cloudscribe.Core.Identity
{
public static class ClaimsPrincipalExtensions
{
public static string GetUserId(this ClaimsPrincipal principal)
{
if (principal == null)
{
throw new ArgumentNullException(nameof(principal));
}
var claim = principal.FindFirst(ClaimTypes.NameIdentifier);
return claim != null ? claim.Value : null;
}
}
}
ClaimType.NameIdentifier 应映射到用户 ID
User.Identity.GetUserId();
在继承 Page
的 class 中可用。
您也可以使用
User.Identity.Name;
有关详细信息,请访问 MSDN
https://msdn.microsoft.com/en-us/library/system.security.principal.windowsidentity(v=vs.110).aspx
根据我们的讨论,您的用户身份似乎不包含 User.GetUserId() 使用的正确声明。
您可以通过以下方式手动设置 NameIdentifier 声明:
// ClaimsIdentity identity = new ClaimsIdentity...
identity.AddClaim(ClaimTypes.NameIdentifier, user.Id);
@Joe Audette
原来是搬家了
User.GetUserId => UserManager.GetUserId(User)
User.GetUserName => UserManager.GetUserName(User)
User.IsSignedIn => SignInManager.IsSignedIn(User)
我的目标是在自定义中间件中检索 UserId 这是我使用的:
httpContext.User.Identity.IsAuthenticated ?
httpContext.User.Claims.Where(c => c.Type == ClaimTypes.NameIdentifier).First().Value
: Guid.Empty.ToString()