.Net Core2.1使用jwt生成Token做身份认证

3 篇文章 0 订阅
2 篇文章 0 订阅

老样子打开vs创建一个.Net Core项目,我使用的是.Net Core Web API(每一个控制器都会自带一个API特性[Route("api/[controller]")]这个就是你接口的访问路径)

接下来进入正题:

首先了解它能做什么?

通过jwt我们可以生成Token返回给前端,前端请求时在请求头加入Token来进行身份认证,jwt还可以做到分角色认证,可以限制不同角色访问接口方法,基本的使用场景就是这样。非常好用!!

对于新手来说也很友好,因为配置十分简单。如果你使用使用的是Core2.1那更加简单因为自带jwt 的NuGet包。

实现分为以下几步:

第一步:在可以在appssettings.json中添加jwt所需的参数,并根据参数结构创建一个实体类JwtSettings。

public class JwtSettings
    {
        /// <summary>
        /// 过期时间
        /// </summary>
        public static string ClockSkew { get; set; }
        /// <summary>
        /// 接收者
        /// </summary>
        public static string ValidAudience { get; set; }
        /// <summary>
        /// 发布者
        /// </summary>
        public static string ValidIssuer { get; set; }
        /// <summary>
        /// 密钥
        /// </summary>
        public static string IssuerSigningKey { get; set; }
        /// <summary>
        /// 刷新时间
        /// </summary>
        public static string Expires { get; set; }
    }

 第二步:在Startup.cs中的ConfigureServices注册jwt服务和Configure中加入中间件。

在ConfigureServices中加入下面的代码,要注意的是接收者ValidAudience 可以不指定到生成Token的方法中再指定可以做到多角色

#region jwt配置

            //jwt

            Configuration.Bind("JwtSettings", new JwtSettings());//读取配置文件赋值JwtSettings

            //配置jwt            
            services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddJwtBearer(optins =>
            {
                optins.RequireHttpsMetadata = false;//是否https

                optins.TokenValidationParameters = new TokenValidationParameters()
                {

                    ValidateIssuer = true,
                    ValidIssuer = JwtSettings.ValidIssuer,//发布者
                    ValidateAudience = true,
                    ValidAudience = JwtSettings.ValidAudience,//接收者(可以不设置,在生成Token时再指定)
                    ValidateIssuerSigningKey = true,
                    IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(JwtSettings.IssuerSigningKey)),//密钥
                    ValidateLifetime = true,
                    ClockSkew = TimeSpan.Zero,//时间
                };

            });
            //end
#endregion

然后在Configure中加入代码:

 //jwt
    app.UseAuthentication();
 //end

做完上面的工作我们就可以愉快的在控制器中使用啦!

第三步:如何使用??这里简单做了一个登录的例子。

 Controller层代码

#region 生成用户Token
        /// <summary>
        /// 生成token
        /// </summary>
        /// <param name="jsonStr">用户实体json</param>
        /// <param name="minutes">Token过期时间</param>
        /// <returns></returns>
        public string CreatToken(string jsonStr, int minutes)
        {
            var claim = new Claim[]
            {
                new Claim("user",jsonStr),//用户信息,可以选择部分用户信息存入,方便根据前端请求Token获取对应信息(json格式)
                new Claim(ClaimTypes.Role,"user")//角色
            };

            //密钥
            var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(JwtSettings.IssuerSigningKey));
            //证书签名
            var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

            //生成token
            var token = new JwtSecurityToken(JwtSettings.ValidIssuer//发布者
                                             , JwtSettings.ValidAudience//接收者
                                             , claim //用户信息角色信息
                                             , DateTime.Now//当前创建时间
                                             , DateTime.Now.AddMinutes(minutes)//过期时间
                                             , creds//证书签名
                                             );
            string tokenStr = new JwtSecurityTokenHandler().WriteToken(token);//写入token

            return tokenStr;//返回
        }
#endregion

                                                                BLL业务逻辑层代码

登录的时候访问api/UserLogin/GetToken就可获得Token了。

获取Token后如下面这个接口加上[Authorize(Roles = "user")]代表请求该接口就需要请求头中包含Token并且接收者角色是user的Token。

 如果请求头中包含Token则正常返回数据 

注意在前端在传回Token时前面要加上Bearer  (与token中间是有空格的)

 

,否则显示内容如下图所示报401错误,因为Headers请求头中没有包含Token。

以上就是对jwt使用总结,供大家参考。

 

最后插播工具,推荐大家使用SwaggerUI,可以说webapi开发常用。

在nuget包管理中安装Swashbuckle.AspNetCore

然后直接贴代码,在Startup.cs 中分别给ConfigureServices和Configure加入下面的代码

//注册Swagger生成器 
            services.AddSwaggerGen(options =>
            {
                options.SwaggerDoc("v1", new OpenApiInfo
                {
                    Version = "v1",//版本
                    Title = ".netCoreJwt认证",//标题
                    Description = "111212",
                });
                var basePath = AppContext.BaseDirectory;
                var commentsFileName = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
                var xmlPath = Path.Combine(basePath, commentsFileName); 
                options.IncludeXmlComments(xmlPath, true);
            });
            //end

 Configure

//swagger
            app.UseSwagger();
            app.UseSwaggerUI(action =>
            {
                action.ShowExtensions();
                action.SwaggerEndpoint("/swagger/v1/swagger.json", "12121111");
            });
            //end

然后右键启动项——》属性(如下图设置)

 运行项目后它会显示项目的所有api,并且可以进行接口测试。 

以上为个人学习总结,有什么不准确请在评论区相互交流。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
首先,我们需要安装 `Microsoft.AspNet.WebApi` 和 `Microsoft.Owin.Security.Jwt` NuGet 包。 接下来,我们需要在 `WebApiConfig.cs` 文件中配置 Web API 路由: ```csharp public static void Register(HttpConfiguration config) { // 配置路由 config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); // 配置 JWT 认证 ConfigureJwtAuth(config); } ``` 然后,我们需要在 `Web.config` 文件中配置 JWT 令牌的密钥和有效期: ```xml <appSettings> <add key="jwtSecret" value="my_secret_key" /> <add key="jwtExpireDays" value="7" /> </appSettings> ``` 接下来,我们需要创建一个 `JwtAuthManager` 类来管理 JWT 认证: ```csharp using System; using System.Collections.Generic; using System.IdentityModel.Tokens.Jwt; using System.Linq; using System.Security.Claims; using System.Text; using Microsoft.IdentityModel.Tokens; public class JwtAuthManager : IJwtAuthManager { private readonly string _jwtSecret; private readonly double _jwtExpireDays; public JwtAuthManager(string jwtSecret, double jwtExpireDays) { _jwtSecret = jwtSecret; _jwtExpireDays = jwtExpireDays; } public string GenerateToken(IEnumerable<Claim> claims) { var key = Encoding.ASCII.GetBytes(_jwtSecret); var jwtToken = new JwtSecurityToken( claims: claims, expires: DateTime.Now.AddDays(_jwtExpireDays), signingCredentials: new SigningCredentials( new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature) ); var token = new JwtSecurityTokenHandler().WriteToken(jwtToken); return token; } } ``` 然后,我们需要创建一个 `JwtAuthAttribute` 特性,用于在控制器或操作方法上应用 JWT 认证: ```csharp [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] public class JwtAuthAttribute : AuthorizeAttribute { public override void OnAuthorization(HttpActionContext actionContext) { try { var token = actionContext.Request.Headers.Authorization.Parameter; var jwtAuthManager = actionContext.ControllerContext.Configuration .DependencyResolver.GetService(typeof(IJwtAuthManager)) as IJwtAuthManager; var principal = jwtAuthManager.ValidateToken(token); Thread.CurrentPrincipal = principal; HttpContext.Current.User = principal; } catch (Exception) { actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized); return; } base.OnAuthorization(actionContext); } } ``` 最后,我们需要在 `ConfigureJwtAuth` 方法中注册依赖项并配置 JWT 认证: ```csharp private static void ConfigureJwtAuth(HttpConfiguration config) { var jwtSecret = ConfigurationManager.AppSettings["jwtSecret"]; var jwtExpireDays = double.Parse(ConfigurationManager.AppSettings["jwtExpireDays"]); var container = new UnityContainer(); container.RegisterType<IJwtAuthManager, JwtAuthManager>( new InjectionConstructor(jwtSecret, jwtExpireDays)); config.DependencyResolver = new UnityResolver(container); config.Filters.Add(new JwtAuthAttribute()); } ``` 现在,我们可以在控制器或操作方法上应用 `JwtAuth` 特性来启用 JWT 认证: ```csharp [RoutePrefix("api/products")] public class ProductsController : ApiController { [HttpGet] [Route("")] [JwtAuth] public IHttpActionResult Get() { // ... } [HttpGet] [Route("{id}")] [JwtAuth] public IHttpActionResult Get(int id) { // ... } [HttpPost] [Route("")] [JwtAuth] public IHttpActionResult Post([FromBody] Product product) { // ... } // ... } ``` 这样,我们就成功地基于 JWT 实现了 Token 签名认证。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值