NET CORE API权限控制之JWT的创建和引用

在我们的接口调用中,都需要配置权限控制,下面介绍下在ASP NET CORE下使用JWT的步骤:

1.创建鉴权项目

由于鉴权并不需要每次调用都鉴权,所以我们可以自己创建一个项目工程作为鉴权中心,用户拿到鉴权后用对应信息去访问对应API;

2.引用对应DLL

引用System.IdentityModel.Tokens.Jwt.dll

3.编写JWT创建Token的代码

鉴权代码单独写在一个类里,为了应用也封装成接口,服务继承接口,一些信息写在了配置类里:首先贴出代码,如下:

接口信息:

public interface IJWTService    {string GetToken(string UserName);    }

实现信息:

public class JWTService : IJWTService    {private readonly IConfiguration _configuration;public JWTService(IConfiguration configuration)        {            _configuration = configuration;        }public string GetToken(string UserName)        {            Claim[] claims = new[]            {               new Claim(ClaimTypes.Name, UserName),               new Claim("NickName","Richard"),               new Claim("Role","Administrator")//传递其他信息              };            SymmetricSecurityKey key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["SecurityKey"]));            SigningCredentials creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);/**             *  Claims (Payload)                Claims 部分包含了一些跟这个 token 有关的重要信息。 JWT 标准规定了一些字段,下面节选一些字段:                iss: The issuer of the token,token 是给谁的                sub: The subject of the token,token 主题                exp: Expiration Time。 token 过期时间,Unix 时间戳格式                iat: Issued At。 token 创建时间, Unix 时间戳格式                jti: JWT ID。针对当前 token 的唯一标识                除了规定的字段外,可以包含其他任何 JSON 兼容的字段。             * */var token = new JwtSecurityToken(                issuer: _configuration["issuer"],                audience: _configuration["audience"],                claims: claims,                expires: DateTime.Now.AddMinutes(10),//10分钟有效期                signingCredentials: creds);string returnToken = new JwtSecurityTokenHandler().WriteToken(token);return returnToken;        }    }

appsettings.json配置文件,红色部分是配置信息,如下:供上面代码获取配置信息

{  "Logging": {"LogLevel": {      "Default": "Information",      "Microsoft": "Warning",      "Microsoft.Hosting.Lifetime": "Information"}  },  "AllowedHosts": "*",  "audience": "http://localhost:5000",  "issuer": "http://localhost:5000",  "SecurityKey": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDI2a2EJ7m872v0afyoSDJT2o1+SitIeJSWtLJU8/Wz2m7gStexajkeD+Lka6DSTy8gt9UwfgVQo6uKjVLG5Ex7PiGOODVqAEghBuS7JzIYU5RvI543nNDAPfnJsas96mSA7L/mD7RTE2drj6hf3oZjJpMPZUQI/B1Qjb5H3K3PNwIDAQAB"}

4.在鉴权项目工程Startup.cs文件里依赖注入JWT的服务类

编写获取Token的接口编码,如下:

[Route("api/[controller]")]    [ApiController]    public class AuthenticationController : ControllerBase    {         #region 构造函数        private ILogger<AuthenticationController> _logger = null;        private IJWTService _iJWTService = null;        private readonly IConfiguration _iConfiguration;        public AuthenticationController(ILogger<AuthenticationController> logger,            IConfiguration configuration            , IJWTService service)        {            this._logger = logger;            this._iConfiguration = configuration;            this._iJWTService = service;        }        #endregion[Route("Login")]        [HttpGet]        public string Login(string name, string password)        {            ///这里应该是需要去连接数据库做数据校验,为了方便所有用户名和密码写死了            if ("sxwcorejwt".Equals(name) && "123456".Equals(password))//应该数据库            {                string token = this._iJWTService.GetToken(name);                return JsonConvert.SerializeObject(new{                    result = true,                    token                });            }            else{                return JsonConvert.SerializeObject(new{                    result = false,                    token = ""});            }        }    }

启动鉴权项目服务,调用Login方法就可以获取到鉴权的Token,如下图;

5.API工程引用对应DLL

引用Microsoft.AspNetCore.Authentication.JwtBearer.dll

6.在API工程Startup.cs文件下添加配置代码,

代码配置几乎都是一样,有响应的备注,大家应该可以看懂,就不多说了,如下图:

Startup.cs全部代码如下:

public class Startup    {public Startup(IConfiguration configuration)        {            Configuration = configuration;        }public IConfiguration Configuration { get; }// This method gets called by the runtime. Use this method to add services to the container.public void ConfigureServices(IServiceCollection services)        {            services.AddControllers();#region JWT鉴权授权//services.AddAuthentication();//禁用  var ValidAudience = this.Configuration["audience"];var ValidIssuer = this.Configuration["issuer"];var SecurityKey = this.Configuration["SecurityKey"];            services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)  //默认授权机制名称;                                       .AddJwtBearer(options => {                         options.TokenValidationParameters = new TokenValidationParameters                         {                             ValidateIssuer = true,//是否验证Issuer ValidateAudience = true,//是否验证Audience ValidateLifetime = true,//是否验证失效时间 ValidateIssuerSigningKey = true,//是否验证SecurityKey ValidAudience = ValidAudience,//Audience ValidIssuer = ValidIssuer,//Issuer,这两项和前面签发jwt的设置一致  表示谁签发的Token IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(SecurityKey))//拿到SecurityKey                         };                     });#endregion}// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.public void Configure(IApplicationBuilder app, IWebHostEnvironment env)        {if (env.IsDevelopment())            {                app.UseDeveloperExceptionPage();            }#region 通过中间件来支持鉴权授权app.UseAuthentication();#endregionapp.UseRouting();            app.UseAuthorization();            app.UseEndpoints(endpoints =>{                endpoints.MapControllers();            });        }    }

View Code

注意:appsettings.json配置文件,也要添加红色部分是配置信息,这里面的配置要和鉴权项目里的配置要一样如下:

{  "Logging": {    "LogLevel": {      "Default": "Information",      "Microsoft": "Warning",      "Microsoft.Hosting.Lifetime": "Information"}  },  "AllowedHosts": "*",  "audience": "http://localhost:5000",  "issuer": "http://localhost:5000",  "SecurityKey": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDI2a2EJ7m872v0afyoSDJT2o1+SitIeJSWtLJU8/Wz2m7gStexajkeD+Lka6DSTy8gt9UwfgVQo6uKjVLG5Ex7PiGOODVqAEghBuS7JzIYU5RvI543nNDAPfnJsas96mSA7L/mD7RTE2drj6hf3oZjJpMPZUQI/B1Qjb5H3K3PNwIDAQAB"}

7.在对应方法或者对应控制器上添加鉴权机制

如果是某一个方法需要鉴权只需要在对应方法上添加属性:[Authorize],如下图

如果是针对整个控制器上所有的方法都需要鉴权只需要在对控制器上添加属性:[Authorize],方法就不需要添加了,如下图

在控制器上添加属性:[Authorize],会使所有此控制器的方法需要鉴权,但是如果此控制器个别方法不需要鉴权,可以在对应方法上添加:[AllowAnonymous],如下图

8.测试鉴权

用postman测试如下:

没有鉴权,报错401,无鉴权,如下图:

用步骤4获取的Token有鉴权调用,如下图:

至此NET CORE API权限控制之JWT的创建和引用已经完成,希望对你有帮助。

(0)

相关推荐

  • Cookie、Session、Token 的区别

    首先我们来说一下认证(Authentication): 通俗的来说认证就是 验证当前用户的身份.例如,你上班打卡,为了防止你作弊,就需要你用到你的指纹来打卡,如果打卡系统里面的指纹和你的指纹匹配,那就 ...

  • dotNET Core 3.X 使用 Jwt 实现接口认证

    在前后端分离的架构中,前端需要通过 API 接口的方式获取数据,但 API 是无状态的,没有办法知道每次请求的身份,也就没有办法做权限的控制.如果不做控制,API 就对任何人敞开了大门,只要拿到了接口 ...

  • 授权认证(IdentityServer4)

    区别 OpenId: Authentication :认证 Oauth: Aurhorize :授权 输入账号密码,QQ确认输入了正确的账号密码可以登录 --->认证 下面需要勾选的复选框(获取 ...

  • ASP.NET Core3基础:01. 示例项目搭建与启动顺序

    一.新建示例项目可以通过dotnet cli和visual studio进行创建项目,这里使用vs进行新建这里选择ASP.NET Core Web应用程序 这里选择API,并且把HTTPS的勾去掉,点 ...

  • 权限控制(delphi actionlist)

    在软件开发中,为软件加入权限控制功能,使不同的用户有不同的使用权限,是非常重要的一项功能, 由其在开发数据库方面的应用,这项功能更为重要. 但是,要为一个应用加入全面的权限控制功能,又怎样实现呢? 大 ...

  • 如何使用页面渲染,TypeScript和“ require”创建ASP.NET Core API项目

    我创建了一个ASP.NETCoreWebAPI项目而不是ASP.NETCoreWebApp项目,因为我正在实现一个API,而不是Web应用程序.但是,我的API包含用于管理和测试API函数的默认页面, ...

  • ASP.Net Core 3.1 中使用JWT认证

    JWT认证简单介绍 关于Jwt的介绍网上很多,此处不在赘述,我们主要看看jwt的结构. JWT主要由三部分组成,如下: HEADER.PAYLOAD.SIGNATURE HEADER包含token的元 ...

  • DRF之访问权限控制和访问频率控制(节流)

    权限控制 前言 用户验证用户权限,根据不同访问权限控制对不同内容的访问. 建议了解视图.token验证的内容. 使用流程 自定义访问权限类,继承BasePermission,重写has_permiss ...

  • elasticsearch7.8权限控制和规划

    由于在版本7开始,x-pack可以免费使用了,但是权限控制免费的不够细,但是控制到索引级别都基本够用了.付费的可以体验更细致的权限控制.本文的基础是已经有了es集群的基础上进行的.官网:https:/ ...

  • 视图、存储过程以及权限控制练习

    视图.存储过程以及权限控制 导读: 该文章为视图.存储过程.用户权限练习: 如果有不对的地方欢迎指出与补充: 该基础练习基于MySQL5.0以上: 语句格式: 1. 视图格式: create view ...

  • delphi 权限控制(delphi TActionList方案)

    delphi 权限控制(delphi TActionList方案) 作者:admin 来源: 日期:2011/8/11 9:35:22 人气:2043 标签: delphi 权限控制(delphi T ...

  • 利用Excel和这个函数,对PowerBI报告进行动态的权限控制

    关于PowerBI的行级安全性,之前已经介绍过怎么用,如果你还没有看过,请先看一下这两篇文章: 利用Power BI行级安全性,限制用户访问权限 Power BI行级安全性三种常见的角色规则设置  有 ...

  • Power BI页面级权限控制,其实只需要这3步

    平时被经常问到的一个问题,就是PowerBI能不能按页面进行权限控制?比如A用户只允许查看报告的第2页,B用户只能查看第6页等,PowerBI本身是没有这个功能的,行级安全性(RLS)也是只能限制数据 ...