c#关于JWT跨域身份验证的实现代码

关于"C#关于JWT跨域身份验证的实现代码"的攻略,我们可以从以下几个方面展开讲解:

  1. 什么是JWT跨域身份验证
  2. JWT的结构
  3. 使用C#实现JWT跨域身份验证
  4. 示例代码

什么是JWT跨域身份验证?

经典的客户端身份验证方法是Cookie和Session,但是该方法有一些缺陷。一个替代方案是JWT,它能够高效并安全地在客户端和服务器之间进行身份验证。JWT(JSON Web Token)是由JSON对象组成的字符串,用于安全地将用户信息传递到服务器。它由三个部分组成:Header、Payload和Signature。Header描述了令牌的类型和摘要算法。Payload包含了用户的信息。Signature是使用密钥和摘要算法生成的哈希值,确保令牌在传输过程中不被篡改。

JWT的结构

JWT由三个部分组成,每个部分都以Base64编码的字符串表示,并用“.”作为分隔符。例如:xxxxxx.yyyyyy.zzzzzz

  1. Header,JSON格式,用于描述JWT的元数据,它包含两个属性:alg和typ,分别代表签名的算法和JWT本身的类型。
  2. Payload,JSON格式,用于存储有价值的信息。又称Claims,分为标准Claims、公共Claims和私有Claims三类。
  3. Signature,使用Header和Payload组成的字符串加上一个Secret Key使用指定的算法生成的签名,用于验证消息的完整性。

使用C#实现JWT跨域身份验证

下面是使用C#实现JWT跨域身份验证的步骤:

1. 安装JWT库

通过NuGet包管理器快速安装Microsoft.AspNetCore.Authentication.JwtBearer

2. 配置JWT服务

在Startup配置文件ConfigureServices方法中添加以下代码:

services.AddAuthentication(options =>
  {
      options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
      options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
  })
  .AddJwtBearer(options =>
  {
      options.RequireHttpsMetadata = false;
      options.SaveToken = true;
      options.TokenValidationParameters = new TokenValidationParameters
      {
          ValidateIssuerSigningKey = true,
          IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(Configuration.GetSection("AppSettings:Token").Value)),
          ValidateIssuer = false,
          ValidateAudience = false
      };
  });

此处配置了JwtBearer中间件,并指定了TokenValidationParameters的相关参数。

3. 配置身份验证中间件

在Startup配置文件Configure方法中添加以下代码:

app.UseAuthentication();

4. 生成JWT Token

创建一个AuthController,并添加以“api/auth”作为前缀的路由,添加登录Post请求方法

[Route("api/auth")]
[ApiController]
public class AuthController : ControllerBase
{
    private readonly IConfiguration _config;

    public AuthController(IConfiguration config)
    {
        _config = config;
    }

    [HttpPost("login")]
    public IActionResult Login([FromBody]UserModel login)
    {
        IActionResult response = Unauthorized();
        var user = AuthenticateUser(login);

        if (user != null)
        {
            var tokenString = GenerateJWTToken(user);
            response = Ok(new { token = tokenString });
        }

        return response;
    }

    //Auth Api Method
}

在Login方法中,我们调用AuthenticateUser方法来验证用户的身份。如果用户名和密码正确,则会调用GenerateJWTToken方法来生成JWT Token并返回给客户端。GenerateJWTToken方法将使用SymmetricSecurityKey在Header和Payload中添加相关信息,并生成哈希签名添加到Token的尾部。

private string GenerateJWTToken(UserModel userInfo)
{
    var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["Jwt:SecretKey"]));
    var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);

    var claims = new[]
    {
        new Claim(JwtRegisteredClaimNames.Sub, userInfo.UserID),
        new Claim(JwtRegisteredClaimNames.Email, userInfo.EmailAddress),
        new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
    };

    var token = new JwtSecurityToken(
        issuer: _config["Jwt:Issuer"],
        audience: _config["Jwt:Issuer"],
        claims: claims,
        expires: DateTime.Now.AddMinutes(20),
        signingCredentials: credentials);

    return new JwtSecurityTokenHandler().WriteToken(token);
 }

5. 使用JWT Token认证

在需要进行身份验证的Controller或Action中添加以下特性

[Authorize]
public class UsersController : ControllerBase
{
    // users controller apis
}

使用[Authorize]特性标记的任何Controller或Action将强制要求用户在访问时提供有效的JWT Token。

示例代码

完整的示例代码是比较长的,其中包括Demo的创建,JWT的生成等内容,我只给出2个大致示例:

1. Startup.cs中的JWT服务配置

public void ConfigureServices(IServiceCollection services)
{
    ...
    services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddJwtBearer(options =>
             {
                 options.TokenValidationParameters = new TokenValidationParameters
                 {
                     ValidateIssuer = true,
                     ValidateAudience = true,
                     ValidateLifetime = true,
                     ValidateIssuerSigningKey = true,

                     ValidIssuer = Configuration["JwtConfig:Issuer"],
                     ValidAudience = Configuration["JwtConfig:Audience"],
                     IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["JwtConfig:Key"]))
                 };
             });
}

2. UsersController.cs中的示例

[Route("api/[controller]")]
[ApiController]
public class UsersController : ControllerBase
{
    private readonly IUserRepository _userRepository;

    public UsersController(IUserRepository userRepository)
    {
        _userRepository = userRepository;
    }

    [HttpGet("{id}")]
    [Authorize]
    public async Task<ActionResult<UserDto>> Get(int id)
    {
        var existingUser = await _userRepository.GetByIdAsync(id);

        if (existingUser == null)
        {
            return NotFound();
        }

        var result = new UserDto
        {  
            ...
        };

        return result;
    }
}

如上述示例代码所示,我们可以成功地使用C#代码实现JWT跨域身份验证。需要注意的是,本示例中,我们是在API控制器中直接使用的JWT Token来进行用户身份验证。如果您正在使用标准MVC构架,可以使用其他方式来实现身份验证,并指定JWT值来进行授权。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c#关于JWT跨域身份验证的实现代码 - Python技术站

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

相关文章

  • 一个.net 压缩位图至JPEG的实例代码

    针对.NET中压缩位图至JPEG的要求,我们可以通过以下步骤来实现: 1. 加载压缩前的位图 我们可以使用Bitmap类的FromStream方法,从文件流或内存流中获取位图,如下所示: using System.Drawing; //… //加载要压缩的位图 Bitmap bmpBefore = new Bitmap("D:/test.bmp…

    C# 2023年5月31日
    00
  • asp.net下UTF-7转GB2312编码的代码(中文)

    下面是ASP.NET下UTF-7转GB2312编码的完整攻略。 什么是UTF-7编码和GB2312编码 UTF-7是一种基于ASCII的Unicode编码方案,使用7位ASCII码来传输Unicode字符,是一种比较特殊的编码方式。 GB2312是中华人民共和国颁布的简体中文编码字符集,它是由号称“中国文字信息处理第一人”、清华大学教授王儒林领导的设计小组设…

    C# 2023年5月31日
    00
  • C#加密app.config中连接字符串的方法

    以下是详细讲解“C#加密app.config中连接字符串的方法”的完整攻略: 1. 什么是app.config连接字符串 在使用C#开发应用程序时,可能需要将连接数据库时使用的信息存储在app.config文件中。该文件通常被称为应用程序配置文件,其中包含有关应用程序设置的信息,包括数据库连接字符串、应用程序窗口大小、应用程序特定的设定等。 连接字符串也是应…

    C# 2023年6月7日
    00
  • C#正则表达式转义字符介绍

    当我们在使用C#正则表达式时,有时需要匹配一些包含特殊字符的字符串,例如$、\、*等,但这些特殊字符使用起来有时会比较麻烦。这时我们可以使用转义字符来表示这些字符,让正则表达式更加灵活。下面将详细介绍C#正则表达式转义字符的使用方法,包括常见的转义字符以及示例说明。 转义字符介绍 以下是常见的C#正则表达式转义字符以及它们所代表的特殊字符: 转义字符 说明 …

    C# 2023年6月7日
    00
  • C# Directory.GetFiles()函数案例详解

    C# Directory.GetFiles()函数案例详解 1. 函数介绍 C# Directory.GetFiles() 函数是一个用于获取指定目录下的所有文件的方法。该方法接受一个目录路径作为参数,并返回一个字符串数组,包含了指定目录中所有文件的路径信息。 该函数的定义如下: public static string[] GetFiles(string …

    C# 2023年6月1日
    00
  • 详解C#中多态性学习/虚方法/抽象方法和接口的用法

    详解C#中多态性学习 多态性 多态性是面向对象程序设计(OOP)的一个核心概念。在OOP中,多态性是指不同的类对相同的消息作出不同的响应。 多态性是OOP的三大基本特性之一,另外两个特性是封装和继承。它允许我们在一个类的层次结构中定义一个抽象类或接口,并让子类实现具体的行为。这种方法使代码更加灵活和可扩展。 虚方法 虚方法 (virtual method) …

    C# 2023年5月31日
    00
  • asp.net 读取并修改config文件实现代码

    ASP.NET 是一个非常受欢迎的 Web 应用程序开发框架,其配置文件 config 文件是应用程序的核心之一,配置文件存储了应用程序运行所需的信息。我们可以通过读取和修改 config 文件来完成应用程序的配置。在本文中,我将详细讲解如何通过 ASP.NET 读取并修改 config 文件的方法。 准备工作 首先,我们需要准备好目标 config 文件。…

    C# 2023年5月31日
    00
  • C#/.net程序调用Python的教程分享

    下面是关于C#/.NET程序调用Python的教程分享的完整攻略和两个示例说明: 一、前置条件 在开始学习如何在C#/.NET程序中调用Python之前,我们需要准备以下几个前置条件: 首先,确保我们的计算机中已经安装了Python环境。 其次,需要使用NuGet安装Python.NET库,用于C#/.NET程序中调用Python。 我们还需要知道Pytho…

    C# 2023年6月7日
    00
合作推广
合作推广
分享本页
返回顶部