.NET 10 WebApi程序JWT令牌 添加全局验证和身份获取

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

庭院深深深几许?杨柳堆烟,帘幕无重数。
玉勒雕鞍游冶处,楼高不见章台路。
雨横风狂三月暮。门掩黄昏,无计留春住。
泪眼问花花不语,乱红飞过秋千去。

欧阳修

付款二维码

如果感觉对您有帮助
欢迎向作者提供捐赠
这将是创作的最大动力