zoukankan      html  css  js  c++  java
  • ASP.NET Core 基于JWT的认证(二)

    ASP.NET Core 基于JWT的认证(二)

    上一节我们对 Jwt 的一些基础知识进行了一个简单的介绍,这一节我们将详细的讲解,本次我们将详细的介绍一下 Jwt在 .Net Core 上的实际运用。

    环境

    • .Net Core 2.2
    • Visual Studio 2017
    • ASP.NET Core WebAPI2

    在上一篇文章中,我们详细的介绍了JWT的知识,这一次,我们将进行一次实战的训练,这一块将会有三个部分组成。分别是:
    1.如何使用微软官方提供的库实现jwt
    2.如何自定义一个Jwt认证类
    3.使用非关系型数据库Redisjwt信息的更新和替换
    当然,我在后期的文章中也会讲解如何使用IdentityServer4去进行我们的权限控制。
    在本文中,你将会学到如何使用微软官方提供的库进行Jwt的签发、验证以及权限控制。我们使用的WebApi作为演示程序。

    配置信息的存储

    通常来说,我们会把数据库等等一系列的配置放在我们的appsettings.json中,我们也尝试着将我们的jwt私钥等存在其中。

     "JwtSettings": {
        "Issuer": "admin",
        "Audience": "user",
        "SecretKey": "ahfuawivb754huab21n5n1"
      }

    当然你也可以把更多的配置放进去。
    然后我们用依赖注入的方法,将配置文件注入到我们的类对象中。我们创建一个JwtSetting类,并且在服务中进行注入。
    类对象

    public class JwtSettings
        {
            /// <summary>
            /// 证书颁发者
            /// </summary>
            public string Issuer { get; set; }
    
            /// <summary>
            /// 允许使用的角色
            /// </summary>
            public string Audience { get; set; }
    
            /// <summary>
            /// 加密字符串
            /// </summary>
            public string SecretKey { get; set; }
        }

    注入

    services.Configure<JwtSettings>(Configuration.GetSection("JwtSettings"));
                JwtSettings setting = new JwtSettings();
                Configuration.Bind("JwtSettings", setting);
                JwtHelper.Settings = setting;

    想必这里的代码大家肯定是看的轻车熟路了,非常的简单。
    接下来我们对Jwt的签发制作一个JwtHelper类。

    Jwt的签发

    这一块,你可以上网去查看权限模型的一些介绍。

    这里我简要的做一个介绍:
    Claim是什么呢,他就是一个用于描述一个具体的实体对象的一些描述性的字段。

    ClaimsIdentity就是用于指明Claim中所存储的内容的合集,比如我们的身份证,年龄、性别、身份证号码等就组成了我们的身份证。

    ClaimsPrincipal我们称为“证件当事人”,也就是我们之前声明的东西的一个合计,类似,比如说你可能有驾照、身份证、医保卡等等,而所持有这些的人就叫做ClaimsPrincipal

    一些代码是一个普通的结构,大家可以按照这种模板进行修改模型,从而创建自己的jwt结构

    代码:

    public class JwtHelper
        {
            private static JwtSettings settings;
            public static JwtSettings Settings { set { settings = value; } }
            public static string create_Token(TokenPayload user)
            {
                //这里就是声明我们的claim
                var claims = new Claim[] {
                            new Claim(ClaimTypes.Name, user.Name),
                            new Claim(ClaimTypes.Role, user.Role),
                            new Claim(ClaimTypes.Sid,user.Sid.ToString())
                        };
                var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(settings.SecretKey));
                var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
    
                var token = new JwtSecurityToken(
                    issuer: settings.Issuer,
                    audience: settings.Audience,
                    claims: claims,
                    expires: DateTime.Now.AddDays(1),
                    signingCredentials: creds);
                var Token = new JwtSecurityTokenHandler().WriteToken(token);
                return Token;
            }
        }

    JWT认证

    在这里,你可以使用我们下一节所遇到的自定义认证,不过我们还是先学着使用我们最为普通的官方方法。具体的操作非常简单,只需要在我们的容器service中注入一下就可以了。

    services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
                .AddJwtBearer(config =>
                {
                    config.TokenValidationParameters = new TokenValidationParameters
                    {
                        ValidateIssuer = true,//是否验证Issuer
                        ValidateAudience = true,//是否验证Audience
                        ValidateLifetime = true,//是否验证失效时间
                        ValidateIssuerSigningKey = true,//是否验证SecurityKey
                        ValidAudience = setting.Audience,//Audience
                        ValidIssuer = setting.Issuer,//Issuer,这两项和前面签发jwt的设置一致
                        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(setting.SecretKey))//拿到SecurityKey
                    };
                });

    这样,就完成了我们的jwt认证过程。
    如果我们需要从token中取出我们的信息也非常的简单,利用依赖注入,使用如下

    services.AddTransient<IGetInfoFromToken, GetInfoFromToken>();


    自己创建号这两个接口和类,对httpcontext进行截断,从httpcontext.user中就可以直接取出我们需要的payload。当然也可以使用中间件的方式,这里我们就不再用篇幅进行叙述了。

    原文链接:https://www.cnblogs.com/WarrenRyan/p/10551630.html

  • 相关阅读:
    repeater绑定li实现不同样式
    fckeditor 上传图一直显示进度条
    Repeater 获取 DataItem 属性值
    js让显示层居中且有遮挡层(IE,火狐,Chrome均可)
    自定义控件学习(一)
    asp.net做系统时,经典的上左右Iframe
    const与readonly
    如何设置制定按钮为希望响应回车的真正按钮
    domestic的定义
    ebay api(解决固价与拍卖异常问题)
  • 原文地址:https://www.cnblogs.com/treeskyer/p/12731701.html
Copyright © 2011-2022 走看看