在 Entity Framework Core 中获取当前用户 ID 的正确方法

2024-01-08

对于 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(使用前将#替换为@)

在 Entity Framework Core 中获取当前用户 ID 的正确方法 的相关文章

随机推荐