.net6 基本使用JWT生成Token,模拟用户登录,启动api授权,需要登录携带token才能请求数据,基本给用户添加权限管理

25 篇文章 7 订阅
2 篇文章 0 订阅
1. 创建好项目,添加一个控制器,新建用户登录api接口和接收用户登录信息类Dto

在这里插入图片描述
Dto就包含两个字段,账号和密码
在这里插入图片描述

2. 安装NuGet包,搜索JWT,安装图下这个包

在这里插入图片描述

3. 在appsettings.json添加JWT加密需要的私钥,发布者等相关配置信息,私钥用户可以自定义。

私钥:SecretKey
发布者:Issuer
接收者:Audience

"Authentication": {
    "SecretKey": "nadjhfgkadshgoihfkajhkjdhsfaidkuahfhdksjaghidshyaukfhdjks",
    "Issuer": "www.adsfsadfasdf",
    "Audience": "www.adsfsadfasdf"
  }

在这里插入图片描述

4. 生成JWT,存放用户信息,上篇文章我们基本认识解析了JWT,JWT分为三部分:
  • 标头(Header):有令牌的类型和所使用的签名算法,如HMAC、SHA256、RSA,用于加密Signature,使用Base64编码组成。
  • 有效载荷(Payload):存放用户信息,用户id,权限等,不不放用户敏感的信息,如密码,使用Base64编码组成。
  • 签名(Signature):使用编码后的header和payload
    加上我们提供的一个密钥,使用header中指定的签名算法(HS256)进行签名加密。
using JWTDemo.Dtos;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;

namespace JWTDemo.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class AuthenticationController : ControllerBase
    {
        public readonly IConfiguration _configuration;
        public AuthenticationController(IConfiguration configuration)
        {
            _configuration=configuration;
        }
        [HttpPost("login")]
        public IActionResult Login([FromBody] LoginDto loginDto)
        {
            //1.验证用户账号密码是否正确,暂时忽略,因为我们是模拟登录

            //2.生成JWT
            //Header,选择签名算法
            var signingAlogorithm = SecurityAlgorithms.HmacSha256;
            //Payload,存放用户信息,下面我们放了一个用户id
            var claims = new []
            {
                new Claim(JwtRegisteredClaimNames.Sub,"user_id")
            };
            //Signature
            //取出私钥并以utf8编码字节输出
            var secretByte = Encoding.UTF8.GetBytes(_configuration["Authentication:SecretKey"]);
            //使用非对称算法对私钥进行加密
            var signingKey = new SymmetricSecurityKey(secretByte);
            //使用HmacSha256来验证加密后的私钥生成数字签名
            var signingCredentials=new SigningCredentials(signingKey, signingAlogorithm);
            //生成Token
            var Token=new JwtSecurityToken(
                    issuer: _configuration["Authentication:Issuer"],        //发布者
                    audience: _configuration["Authentication:Audience"],    //接收者
                    claims: claims,                                         //存放的用户信息
                    notBefore: DateTime.UtcNow,                             //发布时间
                    expires:DateTime.UtcNow.AddDays(1),                      //有效期设置为1天
                    signingCredentials                                      //数字签名
                );
            //生成字符串token
            var TokenStr=new JwtSecurityTokenHandler().WriteToken(Token);
            return Ok(TokenStr);
        }
    }
}

取出用户信息用

//“user_id”键名
var id = HttpContext.User.Claims.First(c => c.Type == "user_id");
5. 启动项目,测试接口,生成token成功

在这里插入图片描述

6. 在Program.cs注入JWT身份认证服务,下面代码均有注释
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        //取出私钥
        var secretByte = Encoding.UTF8.GetBytes(builder.Configuration["Authentication:SecretKey"]);
        options.TokenValidationParameters = new TokenValidationParameters()
        {
            //验证发布者
            ValidateIssuer = true,
            ValidIssuer = builder.Configuration["Authentication:Issuer"],
            //验证接收者
            ValidateAudience = true,
            ValidAudience = builder.Configuration["Authentication:Audience"],
            //验证是否过期
            ValidateLifetime = true,
            //验证私钥
            IssuerSigningKey = new SymmetricSecurityKey(secretByte)
        };
    });

在这里插入图片描述

//添加jwt验证
app.UseAuthentication();
app.UseAuthorization();

在这里插入图片描述

7. 给api加上授权保护,新建一个测试api,在api上面添加[Authorize]
 [HttpGet("test")]
 [Authorize]
 public IActionResult test()
 {
 	return Ok("test");
}
8.测试接口

没登陆获取到Token,直接请求失败,返回401
在这里插入图片描述
登录一下获取到token加到Headers上注意bearer后面有个空格分开,才加上token:

KEY:Authorization
VALUE:bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c2VyX2lkIiwibmJmIjoxNjQ5MzQ0MDY0LCJleHAiOjE2NDk0MzA0NjQsImlzcyI6Ind3dy5hZHNmc2FkZmFzZGYiLCJhdWQiOiJ3d3cuYWRzZnNhZGZhc2RmIn0.-yNVFtme3LzmAJFCcBSjN-DX7w_dZSpmGdrHlo7bXxc

请求成功:
在这里插入图片描述

9.登录成功后给用户添加权限

在之前登录生成JWT的api方法里,我们在JWT的Payload给用户添加一个权限名称信息,new Claim(ClaimTypes.Role,“admin”)
在这里插入图片描述

10.给api接口添加权限

[Authorize(Roles =“admin”)],权限为admin用户才能访问

        [HttpGet("test")]
        [Authorize(Roles ="admin")]
        public IActionResult test()
        {
            return Ok("test");
        }
  • 23
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
您的问题是如何在Java项目中生成Token,并将其传递给C#项目以获取数据。 在Java项目中生成Token,可以使用JWT(JSON Web Token)来实现。JWT是一种开放标准,在身份验证和授权场景中被广泛使用。以下是一个简单的Java代码示例,用于生成和验证JWT: ```java import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import java.util.Date; import java.util.HashMap; import java.util.Map; public class JwtUtil { // 密钥 private static final String SECRET = "your-secret-key"; // 过期时间,单位毫秒 private static final long EXPIRATION_TIME = 60 * 60 * 1000; // 1小时 // 生成JWT public static String generateToken(String username) { Map<String, Object> claims = new HashMap<>(); claims.put("sub", username); claims.put("iat", new Date()); claims.put("exp", new Date(System.currentTimeMillis() + EXPIRATION_TIME)); return Jwts.builder() .setClaims(claims) .signWith(SignatureAlgorithm.HS512, SECRET) .compact(); } // 验证JWT public static boolean validateToken(String token) { try { Jwts.parser().setSigningKey(SECRET).parseClaimsJws(token); return true; } catch (Exception e) { return false; } } // 从JWT中解析出用户名 public static String getUsernameFromToken(String token) { Claims claims = Jwts.parser().setSigningKey(SECRET).parseClaimsJws(token).getBody(); return claims.getSubject(); } } ``` 使用该代码生成Token,可以将其通过HTTP请求或者Restful API等方式传递给C#项目。在C#项目中,可以使用JWT库来验证和解析Token。以下是一个简单的C#代码示例: ```csharp using System; using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; using System.Text; using Microsoft.IdentityModel.Tokens; public class JwtUtil { // 密钥 private static readonly string SECRET = "your-secret-key"; // 验证JWT public static bool ValidateToken(string token) { try { var tokenHandler = new JwtSecurityTokenHandler(); var validationParameters = new TokenValidationParameters { ValidateIssuerSigningKey = true, IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(SECRET)), ValidateIssuer = false, ValidateAudience = false, ClockSkew = TimeSpan.Zero }; tokenHandler.ValidateToken(token, validationParameters, out _); return true; } catch (Exception) { return false; } } // 从JWT中解析出用户名 public static string GetUsernameFromToken(string token) { var tokenHandler = new JwtSecurityTokenHandler(); var validationParameters = new TokenValidationParameters { ValidateIssuerSigningKey = true, IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(SECRET)), ValidateIssuer = false, ValidateAudience = false, ClockSkew = TimeSpan.Zero }; var claimsPrincipal = tokenHandler.ValidateToken(token, validationParameters, out _); var claimsIdentity = (ClaimsIdentity)claimsPrincipal.Identity; return claimsIdentity.Name; } } ``` 使用该代码解析Token,可以获取到其中的用户名,从而进行后续的数据获取操作。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值