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日

相关文章

  • 阿里云杨敬宇:5G时代,边缘计算将发挥更大价值

    摘要:            “5G时代,边缘计算将发挥更大价值。”3月8日,阿里云边缘计算技术负责人杨敬宇向媒体表示,边缘计算作为5G时代的一项关键技术,未来将成为不可或缺的基础设施之一。 “5G时代,边缘计算将发挥更大价值。”3月8日,阿里云边缘计算技术负责人杨敬宇向媒体表示,边缘计算作为5G时代的一项关键技术,未来将成为不可或缺的基础设施之一。 5G时…

    云计算 2023年4月12日
    00
  • 云计算–网络原理与应用–20171123–网络地址转换NAT

    NAT的概述 NAT的配置 实验 一. NAT的概述   NAT(Network address translation,网络地址转换)通过将内部网络的的私有地址翻译成全球唯一的共有网络IP地址,是内部网络可以连接到互联网。   NAT自动修改IP包头中的源IP地址或者目的IP地址,IP地址的校验则在NAT处理过程中自动完成。      NAT实现方式: 静…

    云计算 2023年4月10日
    00
  • ASP.NET Core集成Apollo(阿波罗)

    下面是关于“ASP.NET Core集成Apollo(阿波罗)”的完整攻略,包含两个示例说明。 简介 Apollo是携程开源的一款分布式配置中心,可以实现配置的统一管理和动态更新。在ASP.NET Core应用程序中,我们可以使用Apollo来管理应用程序的配置。在本攻略中,我们将介绍如何在ASP.NET Core应用程序中集成Apollo。 实现步骤 以下…

    云计算 2023年5月16日
    00
  • 3分钟快速学会在ASP.NET Core MVC中如何使用Cookie

    当我们开发Web应用程序时,处理用户的会话和状态变得至关重要。为了满足这个需求,浏览器通常使用Cookie来记录关于用户会话和状态的信息。在ASP.NET Core MVC中,我们可以轻易地使用Cookie来维护会话和状态的信息。 以下是实现在ASP.NET Core MVC中如何使用Cookie的完整攻略。 步骤 1:创建一个ASP.NET Core MV…

    云计算 2023年5月17日
    00
  • xml, oop, 云计算、web service,敏捷开发

        有位老兄写了一篇《被高估的几种it技术》,大部分都没意见,只是对于其中xml, oop, 云计算、web service,敏捷开发几项,感觉应该客观地再评价一下。                xml                xml有其他数据语义标准之长,而无之短,只是语法上上有点儿冗余,但是这东西主要还是让计算机看的,捎待让人看懂已经很不错了…

    云计算 2023年4月11日
    00
  • 抖音云游戏入口在哪 抖音云游戏怎么进

    抖音云游戏是一种基于云计算技术的游戏服务,用户可以通过抖音APP直接进入游戏,无需下载和安装游戏客户端。本文将详细介绍抖音云游戏入口在哪,以及如何进入抖音云游戏。 抖音云游戏入口在哪? 抖音云游戏入口在抖音APP的“游戏”页面中。具体步骤如下: 打开抖音APP,进入首页。 点击底部导航栏中的“游戏”按钮。 在游戏页面中,可以看到“云游戏”入口,点击进入即可。…

    云计算 2023年5月16日
    00
  • 物联网的兴起和云计算的终结

    物联网的兴起和云计算的终结 iot101君编辑整理  2016-12-22 09:58:15 来源: 物联网;云计算 云计算企业在近些年已经大量兴起,但是能存活下来的只剩小部分,而最近兴起的“边缘计算”,“雾计算”也开始对云计算的定位产生了一定的威胁,云计算的发展之路又会变成什么样的呢? 上个星期在Gartner数据中心年度会议上,硅谷风投大佬Andrees…

    云计算 2023年4月12日
    00
  • 基于ASP.NET Core数据保护生成验证token示例

    下面我将详细讲解基于ASP.NET Core数据保护生成验证token的完整攻略,包括过程中的两条示例说明。 首先,我们需要了解什么是数据保护。数据保护是ASP.NET Core框架用于在不同位置存储和使用安全数据的API,它提供了一种可靠的方法来加密和保护敏感数据,并使其在应用程序中的多个请求及持久性存储之间传递。具体来说,数据保护API提供了对大量常见的…

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