C# ASP.NET Core Web API 身份授权(JWT)验证(一)

1.开发环境 VS2022,安装时记得勾选ASP.NET有关的都选上,建议全选,省的麻烦。

        

2.创建初始工程 TestApi (你自己的工程名称)。

 

 这就创建工程成功了,按 F5 则可以进行调试了。

而在项目中,我们不仅仅会用到基础的api功能,我们一般还会用到 身份授权(JWT)Redis缓存MySQL数据库 等,今天只讲身份授权(JWT)。后面文章将继续讲解其他两项。

--------------------添加 身份授权(JWT)--------------------

右键点击工程,选择 管理NuGet程序包 :

在 浏览 页面 搜索框 中输入 Microsoft.AspNetCore.Authentication.JwtBearer

点击安装即可(注意选择版本,选择大版本 6 即可):

 

 安装完成后,打开工程 appsettings.json 配置文件,添加JWT配置:

  "Jwt": {
    "SecretKey": "u6u^Bdob@OJ&KF2RcAB%ybsoy&2S7jhP^SW!q!Z^FK7eB7F8CcxIHsIh4Ll3pL^#",
    "Issuer": "WebAppIssuer",
    "Audience": "WebAppAudience"
  }

 下一步在工程目录下添加文件夹 Common :

 在Common 文件夹中添加 JWTHelper.cs 类:

 完整代码(其中命名空间 namespace TestApi.Common 改成你自己的即可 ):

using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;

namespace TestApi.Common
{
    /// <summary>
    /// 授权JWT类
    /// </summary>
    public class JwtHelper
    {
        private readonly IConfiguration _configuration;

        /// <summary>
        /// Token配置
        /// </summary>
        /// <param name="configuration"></param>
        public JwtHelper(IConfiguration configuration)
        {
            _configuration = configuration;
        }

        /// <summary>
        /// 创建Token 这里面可以保存自己想要的信息
        /// </summary>
        /// <param name="username"></param>
        /// <param name="mobile"></param>
        /// <returns></returns>
        public string CreateToken(string username,string mobile)
        {
            // 1. 定义需要使用到的Claims
            var claims = new[]
            {
            new Claim("username", username),
            new Claim("mobile", mobile),
            /* 可以保存自己想要信息,传参进来即可
            new Claim("sex", "sex"),
            new Claim("limit", "limit"),
            new Claim("head_url", "xxxxx")
            */
        };

            // 2. 从 appsettings.json 中读取SecretKey
            var secretKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Jwt:SecretKey"]));

            // 3. 选择加密算法
            var algorithm = SecurityAlgorithms.HmacSha256;

            // 4. 生成Credentials
            var signingCredentials = new SigningCredentials(secretKey, algorithm);

            // 5. 根据以上,生成token
            var jwtSecurityToken = new JwtSecurityToken(
                _configuration["Jwt:Issuer"],    //Issuer
                _configuration["Jwt:Audience"],  //Audience
                claims,                          //Claims,
                DateTime.Now,                    //notBefore
                DateTime.Now.AddSeconds(30),     //expires
                signingCredentials               //Credentials
            );

            // 6. 将token变为string
            var token = new JwtSecurityTokenHandler().WriteToken(jwtSecurityToken);

            return token;
        }
    }

}

打开 Program.cs 文件,添加注册信息:

#region JWT服务
// 注册JWT服务
builder.Services.AddSingleton(new JwtHelper(builder.Configuration));

builder.Services.AddAuthentication(options =>
{
    options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
}
).AddJwtBearer(options =>
{
    options.TokenValidationParameters = new TokenValidationParameters()
    {
        ValidateIssuer = true, //是否验证Issuer
        ValidIssuer = builder.Configuration["Jwt:Issuer"], //发行人Issuer
        ValidateAudience = true, //是否验证Audience
        ValidAudience = builder.Configuration["Jwt:Audience"], //订阅人Audience
        ValidateIssuerSigningKey = true, //是否验证SecurityKey
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["Jwt:SecretKey"])), //SecurityKey
        ValidateLifetime = true, //是否验证失效时间
        ClockSkew = TimeSpan.FromSeconds(30), //过期时间容错值,解决服务器端时间不同步问题(秒)
        RequireExpirationTime = true,
    };
}
);
#endregion

//记得要添加此句--注册服务
app.UseAuthorization();

 

 添加 Models 文件夹,再UserInfo.cs 类:

完整代码如下:

using System.ComponentModel.DataAnnotations;

namespace TestApi.Models
{
    public class UserInfo
    {
        /// <summary>
        /// 其中 [Required] 表示非空判断,其他自己研究百度
        /// </summary>
        [Required]
        public string UserName { get; set; }
        [Required]
        public string Password { get; set; }
        [Required]
        public string PhoneNumber { get; set; }

    }
}

在Controllers文件夹中添加 API控制器 UserInfoController.cs

 完整代码:

using Microsoft.AspNetCore.Mvc;
using TestApi.Common;
using TestApi.Models;

namespace TestApi.Controllers
{
    [Route("[controller]/[action]")]
    [ApiController]
    public class UserInfoController : ControllerBase
    {
        private readonly JwtHelper _jwt;

        /// <summary>
        /// 初始化
        /// </summary>
        /// <param name="jwtHelper"></param>
        public UserInfoController(JwtHelper jwtHelper)
        {
            _jwt = jwtHelper;
        }
        /// <summary>
        /// 获取Token
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public IActionResult GetToken(UserInfo user)
        {
            //参数验证等等....
            if (string.IsNullOrEmpty(user.UserName))
            {
                return Ok("参数异常!");
            }

            //这里可以连接mysql数据库做账号密码验证


            //这里可以做Redis缓存验证等等


            //这里获取Token,当然,这里也可以选择传结构体过去
            var token = _jwt.CreateToken(user.UserName, user.PhoneNumber);
            return Ok(token);
        }

        /// <summary>
        /// 获取自己的详细信息,其中 [Authorize] 就表示要带Token才行
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        [Authorize]
        public IActionResult GetSelfInfo()
        {
            //执行到这里,就表示已经验证授权通过了
            /*
             * 这里返回个人信息有两种方式
             * 第一种:从Header中的Token信息反向解析出用户账号,再从数据库中查找返回
             * 第二种:从Header中的Token信息反向解析出用户账号信息直接返回,当然,在前面创建        Token时,要保存进使用到的Claims中。
            */
            return Ok("授权通过了!");
        }
    }
}

 然后,就可以 F5 测试了:

下一篇文章将继续介绍Redis:

C# ASP.NET Core Web API Redis使用教程(二)_asp.net redis教程_蛋蛋の微笑的博客-CSDN博客

  • 22
    点赞
  • 77
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: b'.net6.0 webapi jwt认证'是指使用jwt来对.net6.0 webapi进行认证。jwt即JSON Web Token,是一种用于身份验证授权的开放标准。通过使用jwt,我们可以在客户端与服务器之间进行安全的数据传输,同时保证数据的完整性和安全性。在.net6.0 webapi中使用jwt认证,可以有效防止未经授权的访问和攻击。 ### 回答2: 随着互联网技术的不断发展和普及,越来越多的企业和应用程序开始采用WebAPI服务来提供各种不同的功能和服务。随着数据和信息的不断增长,对于WebAPI的安全性和访问控制也变得越来越重要。这正是JWT(Json Web Token)认证的作用所在,它能够让开发者通过在网络上进行点对点的验证来保证信息的安全性。 在.NET 6.0 WebAPI中,JTW验证是一个非常重要的功能,并且可以非常方便地进行集成。它允许通过对包含用户信息的令牌进行签名和加密来进行验证。开发人员只需要在Web API的配置文件(如Startup.cs)中添加验证中间件,并在控制器方法上添加[Authorize]注释。 以下是一个.NET 6.0 WebAPI JTW验证的示例代码: 1.在Startup.cs中添加JTW验证中间件 services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.RequireHttpsMetadata = false; options.SaveToken = true; options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, ValidIssuer = Configuration["Jwt:Issuer"], ValidAudience = Configuration["Jwt:Issuer"], IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(Configuration["Jwt:Key"])) }; }); 2.在Controller的Action中添加[Authorize]注释 [Authorize] [HttpGet] public async Task<IActionResult> Get() { // handle the request } 实现JTW验证对于WebAPI的安全性和稳定性来说都是非常重要的。.NET 6.0 WebAPI的特性和框架支持让JTW验证变得更加容易和便捷,同时还能够提供高效和可靠的API服务。 ### 回答3: 前言 随着移动互联网的快速发展和普及,用户对互联网产品和服务的需求不断增长,而其中的数据安全问题也愈加突出。为了解决这一问题,许多网站和应用都开始采用JWT(JSON Web Token)来加强对接口的认证和授权。 在.NET 6.0中,WebAPI提供了方便的JWT验证机制,开发人员只需要使用一些简洁的代码,就能快速实现对应用程序的用户验证授权管理。 如何使用JWT验证 首先,我们需要在.NET 6.0 WebAPI中注册JWT验证服务,以此来实现对用户请求的认证和授权管理。具体的流程如下: 1. 在应用应用程序启动时,向容器注册JWT认证服务 首先通过 NuGet 安装 Microsoft.AspNetCore.Authentication.JwtBearer 包,然后在 Startup.cs 的 ConfigureServices 方法中添加以下代码: services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, ValidIssuer = "Issuer", ValidAudience = "Audience", IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:Key"])) }; }); 2. 在相应的 API 控制器或操作方法中应用 JWT 验证 然后可以在某些API控制器或操作方法上使用Authorize标记,来启用JWT验证。以下是一个使用Authorize标记的示例: [Authorize] [HttpGet] public async Task<IActionResult> GetUserInfo() { var user = await _userManager.GetUserAsync(User); return Ok(user); } 这些API控制器或操作方法,只有在用户已经成功通过JWT验证后,才会返回数据。否则,用户会收到HTTP 401 Unauthorized 的响应。 3.生成一个JSONWebToken 在用户登录或注册成功后,Web API 服务端需要生成一个 JSONWebToken(JWT)并将其返回给客户端。 下面的示例展示如何使用 SymmetricSecurityKey 和 TokenValidationParameters 来建立 JWT: private async Task<string> GenerateJWTToken(User user) { var jwtSettings = Configuration.GetSection("Jwt"); var key = Encoding.UTF8.GetBytes(jwtSettings["Key"]); var issuer = jwtSettings["Issuer"]; var audience = jwtSettings["Audience"]; var expirationTime = int.Parse(jwtSettings["ExpirationTime"]); var credentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256); var claims = new[] { new Claim(JwtRegisteredClaimNames.Sub, user.UserName), new Claim(JwtRegisteredClaimNames.Email, user.Email), new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()), new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()) }; var tokenDescriptor = new JwtSecurityToken( issuer: issuer, audience: audience, claims: claims, expires: DateTime.UtcNow.AddMinutes(expirationTime), signingCredentials: credentials ); var tokenHandler = new JwtSecurityTokenHandler(); var encodedToken = tokenHandler.WriteToken(tokenDescriptor); return encodedToken; } 经过以上的代码实现,已经在.NET 6.0 WebAPI中实现了基于JWT的用户认证和授权,使得开发人员能够快速、简单地实现用户数据的保护和管理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值