在注入的每个控制器方法中获取自定义 JWT 声明
Get custom JWT Claim in each controller method injected
我有一个 .Net 6 API,我在其中使用 JWT 进行身份验证。
我的 JWT 令牌有一个自定义声明:“customId”。
在我所有控制器的每个方法中,我都想获取 customId。
我已经知道我可以使用:
HttpContext (var identity = HttpContext.User.Identity as ClaimsIdentity;(...)
)
或用户 (User.Claims.SingleOrDefault(...)
)
但我想直接在每个授权控制器(或方法)上注入,所以我不必从HttpContext
或User
每次。
有谁知道我该怎么做?
谢谢!
您可以创建一个基础控制器 class 并定义在其中获取声明实现。
类似于:
public abstract class BaseController : ControllerBase
{
protected string? GetCustomIdClaimValue()
{
return HttpContext?.User?.Claims?.FirstOrDefault(o => o.Type == "sometype")?.Value;
}
}
然后你可以将每个控制器声明为这个 class:
的子控制器
[Authorize]
[Route("api/[controller]")]
[ApiController]
public class ValuesController : BaseController
{
[HttpGet]
public IActionResult Get()
{
return Ok(GetCustomIdClaimValue());
}
}
我有一个 .Net 6 API,我在其中使用 JWT 进行身份验证。 我的 JWT 令牌有一个自定义声明:“customId”。
在我所有控制器的每个方法中,我都想获取 customId。
我已经知道我可以使用:
HttpContext (var identity = HttpContext.User.Identity as ClaimsIdentity;(...)
)
或用户 (User.Claims.SingleOrDefault(...)
)
但我想直接在每个授权控制器(或方法)上注入,所以我不必从HttpContext
或User
每次。
有谁知道我该怎么做? 谢谢!
您可以创建一个基础控制器 class 并定义在其中获取声明实现。
类似于:
public abstract class BaseController : ControllerBase
{
protected string? GetCustomIdClaimValue()
{
return HttpContext?.User?.Claims?.FirstOrDefault(o => o.Type == "sometype")?.Value;
}
}
然后你可以将每个控制器声明为这个 class:
的子控制器[Authorize]
[Route("api/[controller]")]
[ApiController]
public class ValuesController : BaseController
{
[HttpGet]
public IActionResult Get()
{
return Ok(GetCustomIdClaimValue());
}
}