二、Core授權-2 之.net core 基於Jwt實現Token令牌(策略)


Authorization其目標就是驗證Http請求能否通過驗證。ASP.Net Core提供了很多種Authorization方式,詳細可以參考 微軟官方文檔。在這里只詳細介紹三種方式:

Policy

Middleware

Custom Attribute

一、Role授權

 代碼如下:

#region jwt驗證
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AddJwtBearer(options =>
        {
            options.TokenValidationParameters = new TokenValidationParameters
            {
                ValidIssuer = Configuration["Jwt:Issuer"],
                ValidAudience = Configuration["Jwt:Audience"],
                IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:SecretKey"]))
            };
        });
#endregion

在Claim中設置了Role

所以我們可以將  [Authorize]  標簽寫成[Authorize(Roles="admin")]

只有解析出來的token中的角色為admin才授權成功,才可以進入方法內,

在new Claim(ClaimTypes.Role, user) //包含類型為Role的Claim。

如果變量名user是Admin通過[Authorize(Roles="admin")]則驗證不通過,小寫的admin則通過,(區分大小寫)

二、Claims授權

1、要使用Claims授權,我們首先需要在Startup.cs的ConfigureServices方法中添加授權

 授權代碼:

#region jwt驗證
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AddJwtBearer(options =>
        {
            options.TokenValidationParameters = new TokenValidationParameters
            {
                ValidIssuer = Configuration["Jwt:Issuer"],
                ValidAudience = Configuration["Jwt:Audience"],
                IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:SecretKey"]))
            };
        });
#endregion
#region 授權
services.AddAuthorization(options =>
{
    options.AddPolicy("EmployeeOnly", policy => { policy.RequireClaim("EmployeeNumber"); });
});
//如上,我們定義了一個名稱為EmployeeOnly的授權策略,它要求用戶的Claims中必須包含類型為EmployeeNumber的Claim。
#endregion

然后在CommonController.cs生成token的action中的Claim中添加EmployeeNumber

 最后在需要權限認證的地方使用標簽    [Authorize(Policy="EmployeeOnly")]

我們首先獲取一下token,到jwt官網上解析一下發現token中包含EmployeeNumber

 

 然后訪問成功

 如果Claim不包含EmployeeNumber類型的,則訪問失敗。

 訪問

 三、自己定制JWT驗證(自定義Token獲取方式)

自定義類似jwt的token驗證,也就是說直接從header中拿取我們想要的token

1、Startup.cs中的ConfigureServices方法中注釋掉以下內容,然后自定義jwt token

 代碼如下:

            #region jwt驗證
            services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
                    .AddJwtBearer(options =>
                    {
                        /*options.TokenValidationParameters = new TokenValidationParameters
                        {
                            ValidIssuer = Configuration["Jwt:Issuer"],
                            ValidAudience = Configuration["Jwt:Audience"],
                            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:SecretKey"]))
                        };*/

                        #region 自定義Jwt的token驗證
                        options.SecurityTokenValidators.Clear();//將SecurityTokenValidators清除掉,否則它會在里面拿驗證
                        options.SecurityTokenValidators.Add(new MyTokenValidator()); //自定義的MyTokenValidator驗證方法
                        options.Events = new JwtBearerEvents
                        {
                            //重寫OnMessageReceived
                            OnMessageReceived = context =>
                            {
                                var token = context.Request.Headers["mytoken"];
                                context.Token = token.FirstOrDefault();
                                return Task.CompletedTask;
                            }
                        };
                        #endregion

                    });
            #endregion

2、接下來我們新建MyTokenValidator.cs類來驗證token,並讓這個類實現ISecurityTokenValidator接口

 代碼如下:

using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks;

namespace ZanLveCore
{
    public class MyTokenValidator : ISecurityTokenValidator
    {
        bool ISecurityTokenValidator.CanValidateToken => true;

        int ISecurityTokenValidator.MaximumTokenSizeInBytes { get; set; }

        bool ISecurityTokenValidator.CanReadToken(string securityToken)
        {
            return true;
        }

        //驗證token
        ClaimsPrincipal ISecurityTokenValidator.ValidateToken(string securityToken, TokenValidationParameters validationParameters, out SecurityToken validatedToken)
        {
            validatedToken = null;
            //判斷token是否正確
            if (securityToken != "abcdefg")
                return null;

            //給Identity賦值
            var identity = new ClaimsIdentity(JwtBearerDefaults.AuthenticationScheme);
            identity.AddClaim(new Claim("name", "wyt"));
            identity.AddClaim(new Claim(ClaimsIdentity.DefaultRoleClaimType, "admin"));

            var principle = new ClaimsPrincipal(identity);
            return principle;
        }
    }
}

訪問成功

 Swagger UI訪問

 

 其實這種驗證方式是 簡稱 清除驗證規則,自定義驗證方式

options.SecurityTokenValidators.Clear();//將SecurityTokenValidators清除掉,否則它會在里面拿驗證
options.SecurityTokenValidators.Add(new MyTokenValidator()); //自定義的MyTokenValidator驗證方法

還有一種方式是 簡稱 重寫驗證方式
權限授權Handler的繼承AuthorizationHandler的自定義授權類 





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM