gpt4 book ai didi

asp.net-core - 在 Entity Framework Core 中获取当前用户 ID 的正确方法

转载 作者:行者123 更新时间:2023-12-03 13:19:54 25 4
gpt4 key购买 nike

对于 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",

最佳答案

如果您通过 Controller 访问它,那么使用 UserManager 获取用户 ID 的效率非常低,因为您要往返于数据库。如果您使用 ClaimsIdentity,您可以执行以下操作来获取用户 ID:

var claimsIdentity = (ClaimsIdentity)this.User.Identity;
var claim = claimsIdentity.FindFirst(System.Security.Claims.ClaimTypes.NameIdentifier);
var userId = claim.Value;

此方法仅读取 cookie 中已存在的用户 ID,然后自动反序列化并存储在 ClaimsIdentity 实例中。

我使用这个助手类:
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 集合中,您可以在创建用户的 ClaimsIdentity 时轻松添加它:
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;
}
}

关于asp.net-core - 在 Entity Framework Core 中获取当前用户 ID 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38543193/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com