对于 ASP.NET Core 的不同 RC,关于如何获取当前登录用户的 ID,这里有很多不同的答案。我想在这里问一个明确的问题。请注意,project.json 现在有 "Microsoft.AspNetCore.Identity.EntityFrameworkCore": "1.0.0"
使用 RC1,你可以这样做:
using Microsoft.AspNet.Identity;
using System.Security.Claims;
User.GetUserId();
但对于新发布的 EF Core 版本 1,Microsoft.AspNet.Identity 不是正确的版本。
有人建议使用 UserManager,这似乎只是为了获取当前登录的用户:
private Task<ApplicationUser> GetCurrentUserAsync() => _userManager.GetUserAsync(HttpContext.User);
var user = await GetCurrentUserAsync();
var userId = user?.Id;
我发现的另一种方法是:
private readonly UserManager<ApplicationUser> _userManager;
_userManager.GetUserId(User)
那么,对于 ASP.NET Core 1 RTM 和 EF Core 1 以及 project.json 中的以下库,获取当前登录用户的 id 的正确方法是什么?
"Microsoft.AspNetCore.Identity.EntityFrameworkCore": "1.0.0",
"Microsoft.AspNetCore.Mvc": "1.0.0",
如果您从控制器内部访问它,则使用时用户管理器当您往返数据库时,获取用户 ID 的效率非常低。如果您正在使用声明身份,你可以这样做来获取用户 ID:
var claimsIdentity = (ClaimsIdentity)this.User.Identity;
var claim = claimsIdentity.FindFirst(System.Security.Claims.ClaimTypes.NameIdentifier);
var userId = claim.Value;
此方法仅读取 cookie 中已存在的用户 ID,该 ID 又会自动反序列化并存储在声明身份实例。
我使用这个辅助类:
public static class UserHelpers
{
public static string GetUserId(this IPrincipal principal)
{
var claimsIdentity = (ClaimsIdentity)principal.Identity;
var claim = claimsIdentity.FindFirst(System.Security.Claims.ClaimTypes.NameIdentifier);
return claim.Value;
}
}
所以获取用户ID就变成了:
var userId = this.User.GetUserId();
如果由于某种原因,所需的索赔未出现在Claims集合,您可以在创建用户时轻松添加它声明身份:
public class ApplicaionUser : IdentityUser
{
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<User> manager)
{
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
userIdentity.AddClaim(new Claim(ClaimTypes.NameIdentifier, this.UserId));
return userIdentity;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)