gpt4 book ai didi

c# - 在所有 Controller 方法上从 JWT 获取 userId?

转载 作者:太空狗 更新时间:2023-10-29 21:07:49 27 4
gpt4 key购买 nike

我正在创建一个使用 JWT 进行身份验证和授权的 Core 2.0 Web API 项目。我想要保护的 Controller 方法都用 Authorize 属性修饰。

这是有效的。如果我通过 Bearer header 中的 JWT,我会得到 200。如果我未能通过 JWT,我会得到 401。一切正常。在我的 JWT 中,我在授权时将用户 ID 存储在“UserId”字段中。

var claimsdata = new[] {
new Claim("UserId", user.Id.ToString()),

然后我有一个扩展方法:

public static string GetUserId(this IPrincipal user)
{
if (user == null)
return string.Empty;

var identity = (ClaimsIdentity)user.Identity;
IEnumerable<Claim> claims = identity.Claims;
return claims.FirstOrDefault(s => s.Type == "UserId")?.Value;
}

在我的 Controller 方法中,通过“授权”,我经常需要用户的 ID。所以我调用我的 GetUserId 方法。这行得通。但是,我不确定这是否是从 token 中获取 Id 的最佳方式。

int.TryParse(User.GetUserId(), out _userId);

我需要在所有 Controller 上使用该代码。我不能在构造函数中执行此操作,因为 .. 我认为这是错误的。

我在这里做的事情正确吗?

最佳答案

ControllerBase 包含类型为 ClaimsPrincipalUser

您可以通过 User.Claims 访问用户声明,无需 IPrincipal

创建一个包含 GetUserId 方法的基础 Controller 作为 protected

public abstract class BaseController : Controller
{
protected int GetUserId()
{
return int.Parse(this.User.Claims.First(i => i.Type == "UserId").Value);
}
}

所有 Controller 都继承自此,现在所有 Controller 都可以访问UserId

关于c# - 在所有 Controller 方法上从 JWT 获取 userId?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50580232/

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