2025-04-16 乐帮网
webapi
.NET 10 WebApi程序JWT令牌 添加全局验证和身份获取,基于上一篇文章WebAPI 添加JWT令牌身份验证提炼添加全局认证。
一、全局身份认证
在Program类中有两行代码就可以启用身份认证中间件,这个从netcore3.0以来一直没有变过,但是要注意他们的顺序。里面做了啥功能,这个并不是本篇内容,有兴趣看一下源码就理解深刻了。
app.UseAuthentication();
app.UseAuthorization();
有了以上两行代码,我们在Controller中我们主要使用两个Attribute
[AllowAnonymous]和 [Authorize]
在Action或Controller中添加[AllowAnonymous] 表示可以匿名访问,添加[Authorize]则表示需要经过身份验证和授权。默认情况下什么都不加我们是可以访问接口的。需要验证时再添加[Authorize]加以限制,但是系统中会有好多接口,每个都添加有点过于繁琐。有没有办法默认都需要身份验证呢?
可以参考以前版本我们怎么做的,可以参考:https://andrewlock.net/setting-global-authorization-policies-using-the-defaultpolicy-and-the-fallbackpolicy-in-aspnet-core-3/
在新的.Net中可以更简单,我们只需要添加一个方法如下:
app.MapControllers().RequireAuthorization();
这样就可以启用全局身份验证了。细心的小伙伴在上一篇发现有这么一句
var defaultPolicy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
这个变量没有用到,有了它我们可以做具有高级功能的自定义认证,后面有时间会列举一些示例。
二、获取身份认证
身份认证系统已经封闭好了,过程我们并不可见,那如何拿到认证后的内容呢?比如在controller中我需要拿到哪个用户在访问,关键就是使用 HttpContext.User来获取 代码如下:
var user = HttpContext.User.GetUser();
这个GetUser是我封装的一个方法,如下:
public static UserModel? GetUser(this ClaimsPrincipal? principal)
{
if (principal == null)
return null;
if (principal != null && principal.Claims.Any())
{
return new UserModel()
{
UserId = principal.Claims.FirstOrDefault(c => c.Type.Equals("UserId", StringComparison.Ordinal))?.Value ?? string.Empty,
UserName = principal.Claims.FirstOrDefault(c => c.Type.Equals(ClaimTypes.Name, StringComparison.Ordinal))?.Value ?? string.Empty,
RolesString = principal.Claims.FirstOrDefault(c => c.Type.Equals(ClaimTypes.Role, StringComparison.Ordinal))?.Value ?? string.Empty,
};
}
;
return null;
}
当然里面获取的内容需要和签发时的保持一致。
关注我的微信公众号
在公众号里留言交流
投稿邮箱:1052839972@qq.com
庭院深深深几许?杨柳堆烟,帘幕无重数。
玉勒雕鞍游冶处,楼高不见章台路。
雨横风狂三月暮。门掩黄昏,无计留春住。
泪眼问花花不语,乱红飞过秋千去。
如果感觉对您有帮助
欢迎向作者提供捐赠
这将是创作的最大动力