ASP.NET Core应用JWT进行用户认证及Token的刷新方案

下面是关于“ASP.NET Core应用JWT进行用户认证及Token的刷新方案”的完整攻略,包含两个示例说明。

简介

JWT(JSON Web Token)是一种用于身份验证的开放标准,它可以在客户端和服务器之间安全地传输信息。在ASP.NET Core中,我们可以使用JWT来进行用户认证,并实现Token的刷新。本文将详细讲解如何在ASP.NET Core应用中使用JWT进行用户认证及Token的刷新方案。

用户认证及Token的刷新方案

以下是在ASP.NET Core应用中使用JWT进行用户认证及Token的刷新方案的步骤:

  1. 在ASP.NET Core应用中安装Microsoft.AspNetCore.Authentication.JwtBearer NuGet包:
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer

在上面的命令中,我们使用dotnet命令来安装Microsoft.AspNetCore.Authentication.JwtBearer NuGet包。

  1. 在appsettings.json文件中添加JWT配置:
{
  "Jwt": {
    "Issuer": "YourIssuer",
    "Audience": "YourAudience",
    "Key": "YourKey",
    "ExpireMinutes": 60,
    "RefreshExpireMinutes": 1440
  }
}

在上面的代码中,我们添加了JWT的配置信息,包括Issuer、Audience、Key、ExpireMinutes和RefreshExpireMinutes等。

  1. 在Startup.cs文件中添加JWT认证服务:
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
using System.Text;

public void ConfigureServices(IServiceCollection services)
{
    // ...

    var jwtSettings = Configuration.GetSection("Jwt");
    var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSettings["Key"]));

    services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AddJwtBearer(options =>
        {
            options.TokenValidationParameters = new TokenValidationParameters
            {
                ValidateIssuer = true,
                ValidateAudience = true,
                ValidateLifetime = true,
                ValidateIssuerSigningKey = true,
                ValidIssuer = jwtSettings["Issuer"],
                ValidAudience = jwtSettings["Audience"],
                IssuerSigningKey = key
            };
        });

    // ...
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    // ...

    app.UseAuthentication();
    app.UseAuthorization();

    // ...
}

在上面的代码中,我们添加了JWT认证服务,并配置了TokenValidationParameters。

  1. 在AccountController中添加登录和刷新Token的API接口:
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.IdentityModel.Tokens;
using System;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;

[ApiController]
[Route("[controller]")]
public class AccountController : ControllerBase
{
    private readonly IConfiguration _configuration;

    public AccountController(IConfiguration configuration)
    {
        _configuration = configuration;
    }

    [AllowAnonymous]
    [HttpPost("login")]
    public IActionResult Login([FromBody] LoginModel model)
    {
        if (model == null)
        {
            return BadRequest("Invalid client request");
        }

        if (model.Username == "admin" && model.Password == "admin")
        {
            var secretKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Jwt:Key"]));
            var signingCredentials = new SigningCredentials(secretKey, SecurityAlgorithms.HmacSha256);

            var claims = new List<Claim>
            {
                new Claim(ClaimTypes.Name, model.Username),
                new Claim(ClaimTypes.Role, "Admin")
            };

            var tokenOptions = new JwtSecurityToken(
                issuer: _configuration["Jwt:Issuer"],
                audience: _configuration["Jwt:Audience"],
                claims: claims,
                expires: DateTime.Now.AddMinutes(Convert.ToDouble(_configuration["Jwt:ExpireMinutes"])),
                signingCredentials: signingCredentials
            );

            var tokenString = new JwtSecurityTokenHandler().WriteToken(tokenOptions);
            return Ok(new { Token = tokenString });
        }
        else
        {
            return Unauthorized();
        }
    }

    [AllowAnonymous]
    [HttpPost("refresh")]
    public IActionResult Refresh([FromBody] RefreshTokenModel model)
    {
        if (model == null)
        {
            return BadRequest("Invalid client request");
        }

        var principal = GetPrincipalFromExpiredToken(model.Token);
        var username = principal.Identity.Name; //this is mapped to the Name claim by default

        var secretKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Jwt:Key"]));
        var signingCredentials = new SigningCredentials(secretKey, SecurityAlgorithms.HmacSha256);

        var claims = new List<Claim>
        {
            new Claim(ClaimTypes.Name, username),
            new Claim(ClaimTypes.Role, "Admin")
        };

        var tokenOptions = new JwtSecurityToken(
            issuer: _configuration["Jwt:Issuer"],
            audience: _configuration["Jwt:Audience"],
            claims: claims,
            expires: DateTime.Now.AddMinutes(Convert.ToDouble(_configuration["Jwt:ExpireMinutes"])),
            signingCredentials: signingCredentials
        );

        var tokenString = new JwtSecurityTokenHandler().WriteToken(tokenOptions);
        return Ok(new { Token = tokenString });
    }

    private ClaimsPrincipal GetPrincipalFromExpiredToken(string token)
    {
        var tokenValidationParameters = new TokenValidationParameters
        {
            ValidateAudience = false,
            ValidateIssuer = false,
            ValidateIssuerSigningKey = true,
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Jwt:Key"])),
            ValidateLifetime = false //here we are saying that we don't care about the token's expiration date
        };

        var tokenHandler = new JwtSecurityTokenHandler();
        SecurityToken securityToken;
        var principal = tokenHandler.ValidateToken(token, tokenValidationParameters, out securityToken);
        var jwtSecurityToken = securityToken as JwtSecurityToken;
        if (jwtSecurityToken == null || !jwtSecurityToken.Header.Alg.Equals(SecurityAlgorithms.HmacSha256, StringComparison.InvariantCultureIgnoreCase))
        {
            throw new SecurityTokenException("Invalid token");
        }

        return principal;
    }
}

public class LoginModel
{
    public string Username { get; set; }
    public string Password { get; set; }
}

public class RefreshTokenModel
{
    public string Token { get; set; }
}

在上面的代码中,我们添加了Login和Refresh API接口,用于用户登录和Token的刷新。

  1. 在Startup.cs文件中添加Swagger UI:
using Microsoft.OpenApi.Models;

public void ConfigureServices(IServiceCollection services)
{
    // ...

    services.AddSwaggerGen(c =>
    {
        c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" });
    });

    // ...
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    // ...

    app.UseSwagger();
    app.UseSwaggerUI(c =>
    {
        c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
    });

    // ...
}

在上面的代码中,我们添加了Swagger UI,用于测试API接口。

  1. 启动应用程序,并使用Postman等工具测试API接口。

示例说明

以下是两个示例说明,演示如何在ASP.NET Core应用中使用JWT进行用户认证及Token的刷新:

示例1:用户登录

使用Postman向"http://localhost:5000/account/login"发送POST请求,请求体中包含用户名和密码,即可获取Token。

示例2:Token刷新

使用Postman向"http://localhost:5000/account/refresh"发送POST请求,请求体中包含过期的Token,即可获取新的Token。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:ASP.NET Core应用JWT进行用户认证及Token的刷新方案 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • 币圈十大交易平台有哪些?币圈十大交易平台软件

    币圈十大交易平台有哪些?币圈十大交易平台软件攻略 币圈是指数字货币交易市场,随着数字货币的发展,币圈也越来越受到关注。在币圈中,交易平台是非常重要的一环。本文将介绍币圈十大交易平台以及它们的软件攻略。 币圈十大交易平台 以下是币圈十大交易平台: 币安(Binance) 火币网(Huobi) OKEx BitMEX Bitfinex Coinbase Krak…

    云计算 2023年5月16日
    00
  • openstack云计算组件glance功能镜像及版本介绍

    OpenStack云计算组件Glance功能镜像及版本介绍 OpenStack是一个开源的云计算平台,由多个组件构成,其中Glance是OpenStack的镜像服务组件。Glance提供了镜像的存储、管理和共享功能,是OpenStack云计算平台中非常重要的组件之一。以下是OpenStack云计算组件Glance功能镜像及版本介绍的详细攻略,包括以下内容: …

    云计算 2023年5月16日
    00
  • python数据可视化pygal模拟掷骰子实现示例

    让我来详细讲解一下“Python数据可视化pygal模拟掷骰子实现示例”的完整攻略。 简介 Pygal是一个由Python编写的SVG图表制作工具,它可以用来创建各种类型的图表,包括线性图、条形图、散点图和仪表盘等。同时,Pygal也支持与Python交互,可以将数据导入到图表中进行数据可视化分析。在本文中,我们将利用Pygal模拟掷骰子,并将结果可视化为条…

    云计算 2023年5月18日
    00
  • 【原创】探索云计算容器底层之Cgroup

    容器本质上是进程,既然是进程就会消耗掉系统资源,比如:CPU、内存、磁盘、网络带宽等,如果不加以限制,容器在某些情况下就会无限制地吃掉宿主机的系统资源,显然这不是我们期望发生的,另外当我们的环境中运行了很多容器,且系统资源一定的情况下,我们有优先保证主要容器应用的需求,如何既能够解决此问题同时又能够满足我们的需求呢?答案就是:Linux Cgroup(全程L…

    2023年4月10日
    00
  • [Hadoop in China 2011] 朱会灿:探析腾讯Typhoon云计算平台

    http://storage.it168.com/a2011/1203/1283/000001283196.shtml   朱会灿现任腾讯搜搜搜索线首席架构师、基础架构部总经理,于2010年加入腾讯,主导腾讯云计算平台的开发工作。在加入腾讯之前的朱会灿曾在谷歌公 司任职长达10年之久,其间,主导开过过Google的图片搜索系统、大规模爬虫和索引系统、中日韩文…

    云计算 2023年4月10日
    00
  • 点云法线计算

    法线在点云的处理中有着重要的意义,大部分点云的处理都要用到法线如:点云平滑滤波、配准、特征计算与提取,曲率计算等都息息相关。关于法线的计算最早应该来源于“Surface Reconstruction from Unorganized Points” Hugues Hoppe的文章。 其中Hoppe关于法线的计算方法如下:         这个计算过程和方法对…

    云计算 2023年4月12日
    00
  • 云计算运维学习—vim的简单使用

    vim的使用其实是学习Linux系统最基础的部分,这次主要是和大家分享一下vim使用中一些小技巧,便于快速操作。tips:CentOS7系统中默认是没有vim这个编辑器的,它自带的是vi编辑器,所以需要安装一下vim的安装包。使用vim的理由就是vim在vi面前是个爸爸。vim的简单使用vim的三种模式:01.命令模式02.插入模式(编辑模式)03.底行模式…

    云计算 2023年4月13日
    00
  • .NET Core利用swagger进行API接口文档管理的方法详解

    首先,我们需要了解什么是Swagger。Swagger是一个规范和完整的框架,用于生成、描述、消费和可视化RESTful风格的Web服务。它的目标是让客户端和文件系统作为服务器以相同的速度进行更新,并且在这些服务之间达成共识,从而将服务的功能展现出来。在.NET Core中,Swagger可以帮助我们进行API接口文档管理。以下是详细的操作步骤: 1. 安装…

    云计算 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部