• .Net 6 WebAPI 使用JWT进行 授权认证配置


    .Net 6 WebAPI 使用JWT进行 授权认证
    1、安装组件(Nuget)
    Microsoft.AspNetCore.Authentication.JwtBearer
    2、Program.cs 配置
    //授权认证(使用JWT)
    builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(o =>
    {
    // 私钥
    var secretByte = Encoding.UTF8.GetBytes("kdsfldsflkdslkflkdsflkdslfdslkflk");
    o.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters
    {
    // 验证发布者
    ValidateIssuer = true,
    // 发布者信息
    ValidIssuer = "BeiJingBW",

        // 验证接收者
        ValidateAudience = true,
        // 接收者
        ValidAudience = "BeiJingBW",
    
        // 验证是否过期
        ValidateLifetime = true,
    
        // 验证私钥
        IssuerSigningKey = new SymmetricSecurityKey(secretByte)
    
    };
    

    });

    // 配置Swagger
    builder.Services.AddSwaggerGen(o =>
    {
    // 显示 授权信息
    o.AddSecurityDefinition("Bearer", new Microsoft.OpenApi.Models.OpenApiSecurityScheme()
    {
    Description = "添加JWT授权Token:Bearer Token值",
    Name = "Authorization",
    In = Microsoft.OpenApi.Models.ParameterLocation.Header,
    Type = Microsoft.OpenApi.Models.SecuritySchemeType.ApiKey,
    BearerFormat = "JWT",
    Scheme = "Bearer"
    });
    o.AddSecurityRequirement(new Microsoft.OpenApi.Models.OpenApiSecurityRequirement
    {
    {
    new OpenApiSecurityScheme
    {
    Reference = new OpenApiReference
    {
    Type = ReferenceType.SecurityScheme,
    Id = "Bearer"
    }
    },
    new string[]
    {

            }
        }
    });
    

    });

    // 鉴权
    app.UseAuthentication();

    app.UseAuthorization();
    3、控制器加授权认证 [Authorize],登录判定方法设置为匿名可访问 [AllowAnonymous]
    [Route("api/[controller]/[action]")] // 路由配置
    [ApiController]
    [Authorize]
    public class ECommerceController : ControllerBase
    {
    [HttpGet]
    [AllowAnonymous]
    public IActionResult Login(string? loginName, string? password)
    {
    // 登录判定
    }
    }

    4、控制器中,编写生成 JWT Token 方法
    ///


    /// 生成 JWT Token(令牌)
    ///

    ///
    private string CreateTokenString()
    {
    //私钥
    var secretByte = Encoding.UTF8.GetBytes("kdsfldsflkdslkflkdsflkdslfdslkflk");
    // 非对称加密
    var signingKey = new SymmetricSecurityKey(secretByte);
    // 使用256 生成数字签名
    var signingCredentials = new SigningCredentials(signingKey, SecurityAlgorithms.HmacSha256);
    // 生成Token
    var token = new JwtSecurityToken(
    issuer: "BeiJingBW",
    audience: "BeiJingBW",
    expires: DateTime.Now.AddDays(1), // 一天后过期
    signingCredentials: signingCredentials
    );
    // 生成token 字符串
    var strToken = new JwtSecurityTokenHandler().WriteToken(token);
    return strToken;
    }

    5、登录方法中,登录成功要生成 JWT Token,返回给前端
    ///


    /// 登录判定(可以匿名,也就是授权对它没有作业)
    ///

    /// 登录名
    /// 密码
    ///
    [HttpGet]
    [AllowAnonymous]
    public IActionResult Login(string? loginName, string? password)
    {
    try
    {
    // 登录判定,登录成功
    // 登录成功生成JWT Token
    string strToken = this.CreateTokenString();
    }
    // 返回前端信息加Jwt token信息
    return Ok(new
    {
    user = user,
    token = strToken
    });
    }
    catch (Exception ex)
    {
    // 错误日志
    logger.LogError("登录判定出错!" + ex.Message);
    throw;
    }
    }

    6、Swagger中调试
    运行登录方法,复制生成的 JWT token字符串。
    点击 名上角 “Authorize” 按钮,在文本框中输入:Bearer token值,格式如:Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2ODYyOTc3NTgsImlzcyI6IkJlaUppbmdCVyIsImF1ZCI6IkJlaUppbmdCVyJ9.hb9kZv_qj8Eosgnw6ayTf6nA2-07ym6p6xbVS237aI8,点击“Authorize”。
    之后运行Swagger中的其它方法,它会自动加载 JWT token,方法正常运行。如果没有第2部,运行方法会提示无授权的错误。
    7、前端Vue配置
    7.1 main.js 配置
    // 数据访问
    import axios from 'axios'
    // 添加JWT token信息
    axios.defaults.headers.common["Authorization"] = "Bearer " + window.localStorage.getItem("token");
    7.2 登录方法,成功登录后,写token信息到本地
    methods:{
    // 登录
    login() {
    // 登录判定
    // 登录成功,写JWT的 token到本地
    window.localStorage.setItem("token", res.data.token);
    // 数据提交后端要加入新的Token值
    this.axios.defaults.headers.common["Authorization"] =
    "Bearer " + res.data.token;
    }
    }

  • 相关阅读:
    python基于PHP+MySQL的校园帮忙领取快递平台
    测试架构师如何落地性能测试方案(二)
    xavier安装torch-gpu
    android性能优化
    Java Metrics系统性能监控工具
    ACM浅聊
    WEB 跨域
    Eolink征文活动---Eolink API文档服务的天才产品
    react之基于@reduxjs/toolkit使用react-redux
    ICC2:Design Planning(02)Shaping Placement
  • 原文地址:https://www.cnblogs.com/bdszr/p/18032758