zoukankan      html  css  js  c++  java
  • .NET 云原生架构师训练营(模块二 基础巩固 安全)--学习笔记

    2.8 安全

    • 认证 VS 授权
    • ASP .NET Core 认证授权中间件
    • 认证
    • JWT 认证
    • 授权

    认证 VS 授权

    • 认证是一个识别用户是谁的过程
    • 授权是一个决定用户可以干什么的过程
    • 401 Unauthorized 未授权
    • 403 Forbidden 禁止访问

    ASP .NET Core 认证授权中间件

    在接收到请求之后,认证(Authentication)和授权(Authorization) 发生在 路由(Routing) 和 终结点(Endpoint) 之间

    执行过程

    认证

    认证是一个识别用户是谁的过程

    代码示例

    Web api jwt authentication

    在 LighterApi 项目的 Startup.cs 中配置添加服务

    ConfigureServices

    services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AddJwtBearer(
            options => options.TokenValidationParameters = new TokenValidationParameters
            {
                ValidateIssuer = true, // 是否验证 Issuer
                ValidateAudience = true, // 是否验证 Audience
                ValidateLifetime = true, // 是否验证失效时间
                ClockSkew = TimeSpan.FromSeconds(30),
                ValidateIssuerSigningKey = true, // 是否验证 SecurityKey
                ValidAudience = "https://localhost:6001",
                ValidIssuer = "https://localhost:6001",
                IssuerSigningKey =
                    new SymmetricSecurityKey(Encoding.UTF8.GetBytes("secret88secret666")) // 拿到 SecurityKey
            });
    

    Configure

    app.UseAuthentication();
    app.UseAuthorization();
    

    添加标签 [Authorize]

    [Authorize]
    public class ProjectController : ControllerBase
    

    通过 postman 调用接口,返回 401 Unauthorized

    需要通过登录接口获取 token,再带上 token 访问

    JWT 认证

    • 什么是 JWT
    • 颁发 token 代码示例

    什么是 JWT

    JWT 是一个 token,由三部分组成,格式为 xxx.yyy.zzz

    • Header(algorithm + type)
    • Payload(claims)
    • Singature

    颁发 token 代码示例

    namespace LighterApi.Controller
    {
        [ApiController]
        [Route("api/[controller]")]
        public class IdentityController : ControllerBase
        {
            [HttpPost]
            [Route("signin")]
            public IActionResult SignIn()
            {
                var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("secret88secret666"));
                var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);
    
                var token = new JwtSecurityToken(
                    issuer: "https://localhost:6001",
                    audience: "https://localhost:6001",
                    new List<Claim> {new Claim("name", "mingson")},
                    expires: DateTime.Now.AddMinutes(120),
                    signingCredentials: credentials);
    
                return Ok(new JwtSecurityTokenHandler().WriteToken(token));
            }
        }
    }
    

    启动程序,访问接口,获取 token

    通过官网解析

    带上 token 访问接口

    授权

    为接口添加访问需要的角色,具备角色才能访问

    [Authorize(Roles = "Administrators, Mentor")]
    

    SignIn 接口返回 token 中加入角色

    new Claim(ClaimTypes.Role, "Administrators"),
    

    启动程序,获取包含角色的 token

    带上 token 访问需要角色的接口

    GitHub源码链接:

    https://github.com/MINGSON666/Personal-Learning-Library/tree/main/ArchitectTrainingCamp/LighterApi

    课程链接

    https://appsqsyiqlk5791.h5.xiaoeknow.com/v1/course/video/v_5f39bdb8e4b01187873136cf?type=2

    知识共享许可协议

    本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

    欢迎转载、使用、重新发布,但务必保留文章署名 郑子铭 (包含链接: http://www.cnblogs.com/MingsonZheng/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。

    如有任何疑问,请与我联系 (MingsonZheng@outlook.com) 。

  • 相关阅读:
    linux上搭建tingproxy服务
    windows上搭建linux系统
    PHP将图片流存为图片文件
    openLayer矩形框选要素,展示要素属性
    点击选中的要素,更换标注图片,并添加文本标注
    openLayer点击要素获取对应的属性信息
    openLayer实现放大缩小
    openLayer的切换中心点、定位功能
    使用openLayer加载arcgis中的地图
    openLayer实现两个地图联动
  • 原文地址:https://www.cnblogs.com/MingsonZheng/p/14433627.html
Copyright © 2011-2022 走看看