.NET core 8.0 token 验证

本文详细介绍了如何在.NETCore8.0项目中使用Microsoft.AspNetCore.Authentication.JwtBearer进行身份验证,包括在`program.cs`中设置验证参数,从appsettings.json读取密钥和配置,以及生成和验证JWTtoken的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

安装包 Microsoft.AspNetCore.Authentication.JwtBearer

在.net8.0 在program.cs 内添加 以下:

// token验证
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(options =>
    options.TokenValidationParameters = new TokenValidationParameters()
    {
        ValidateIssuer = true,
        ValidIssuer =builder.Configuration["JWT:Issuer"],
        ValidateAudience = true,
        ValidAudience = builder.Configuration["JWT:Audience"],
        ValidateLifetime = true,
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["JWT:SecretKey"]))

    }

);

配置文件 appsetting.json:

 "JWT": {
    "SecretKey": "密钥自定义",
    "Issuer": "自定义",
    "Expires": 24,     //token过期时间
    "Audience": "自定义"
  }

在program.cs内添加

//开启认证
app.UseAuthentication();
//开启授权
app.UseAuthorization();

编写生成Token方法

需要下载 Microsoft.Extensions.Configuration包;

public class TokenCode
{
    private readonly IConfiguration Configuration;
    public TokenCode(IConfiguration Configuration)
    {
        this.Configuration = Configuration;
    }
    /// <summary>
    /// 生成token
    /// </summary>
    /// <param name="uid">用户的id</param>
    /// <returns>自己创建的类</returns>
    public LoginDTO CreateToken(string uid)
    {
        // 1. 定义需要使用到的Claims
        var claims = new[]
        {
            //把用户的id加密进去,使用的时候可以从token里解密拿出来
            new Claim("uid", uid),
            //也可以多传几个参数
            //new Claim("name", "Admin")
        };

        // 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. 从 appsettings.json 中读取Expires
        var expires = Convert.ToDouble(Configuration["JWT:Expires"]);
    
        // 6. 根据以上,生成token
        var token = new JwtSecurityToken(
            Configuration["JWT:Issuer"],     //Issuer
            Configuration["JWT:Audience"],   //Audience
            claims,                          //Claims,
            DateTime.Now,                    //notBefore
            DateTime.Now.AddHours(expires),  //expires token过期时间,这里我设置了24小时
            signingCredentials               //Credentials
        );
    
        // 7. 将token变为string
        var jwtToken = new JwtSecurityTokenHandler().WriteToken(token);
    
        return new LoginDTO
        {
            UID = uid,
            //LoginDTO是自定义的类,Expires我定义为unix时间戳类型,可以改成其他类型
            Expires = DateTime.Now.AddHours(expires),
            Token = jwtToken
        };
    
    }

}

从Token获取验证信息

  protected ValueTask<string> GetUserIdAsync()
    {
        //在Claim中填入的uid取出来
        var userId = HttpContext.User.Claims.FirstOrDefault(t => t.Type == "uid")?.Value ?? string.Empty;
        if (!string.IsNullOrWhiteSpace(userId))
        {
            return new ValueTask<string>(userId);
        }
        return new ValueTask<string>("-1");
    }

调用

string userId= await GetUserIdAsync();

那个控制器接口需要Token验证加上

[Authorize]

在ASP.NET Core 8.0 MVC Razor Web应用程序中使用JWT(JSON Web Tokens)进行登录验证主要涉及以下几个步骤: 1. 添加JWT包依赖:首先需要在项目中添加用于处理JWT的包,如`Microsoft.AspNetCore.Authentication.JwtBearer`。这可以通过NuGet包管理器来完成。 2. 配置JWT认证服务:在`Startup.cs`的`ConfigureServices`方法中配置JWT认证服务。设置JWT的签名密钥、令牌验证参数等。 ```csharp services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, ValidIssuer = Configuration["Jwt:Issuer"], ValidAudience = Configuration["Jwt:Audience"], IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:Key"])) }; }); ``` 3. 授权控制器或动作:在需要保护的控制器或动作上添加`[Authorize]`属性,这样只有通过JWT认证的用户才能访问。 ```csharp [ApiController] [Route("[controller]")] [Authorize] public class WeatherForecastController : ControllerBase { // ... } ``` 4. 生成JWT令牌:在用户成功登录后,根据登录信息生成JWT令牌。这通常在登录接口的处理逻辑中完成。 ```csharp var claims = new Claim[] { new Claim(JwtRegisteredClaimNames.Sub, user.Id.ToString()), new Claim(JwtRegisteredClaimNames.UniqueName, user.UserName), // ... 其他声明 }; var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:Key"])); var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256); var token = new JwtSecurityToken( issuer: Configuration["Jwt:Issuer"], audience: Configuration["Jwt:Audience"], claims: claims, expires: DateTime.Now.AddMinutes(30), signingCredentials: creds); return Ok(new { Token = new JwtSecurityTokenHandler().WriteToken(token) }); ``` 5. 在客户端发送请求时,将生成的JWT令牌放在请求头中。 ```http Authorization: Bearer <token> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值