.Net Core实现JWT授权认证

对于“.Net Core实现JWT授权认证”的完整攻略,我可以提供以下内容。

1. 什么是JWT授权认证

JWT(JSON Web Token)是一种轻量级且具有自包含能力的身份验证和授权协议。它基于 JSON 格式来定义一个安全、紧凑的、自包含的方式俩定义要传递的信息,通常用于验证、授权和信息交换。

2. JWT授权认证的优缺点

2.1 优点

  • 大大减少了网络消耗,状态由客户端记忆
  • 可以在多个应用中共享用户凭证
  • 可以避免 CSRF 攻击和窃听
  • Token 可以是服务器缓存,提升查询效率
  • 能够自动刷新凭证,重新获取Token

2.2 缺点

  • Token 存储不安全(可以使用其他方式解决)
  • Token 不易消除
  • Token被劫持后容易产生较大风险

3. 实现思路

JWT 授权认证实现步骤如下:

  1. 创建 JWT
  2. 把 JWT 发送到客户端
  3. 客户端将 JWT 存储在本地
  4. 客户端每次请求时,都带上存储的 JWT
  5. 服务器验证 JWT 是否合法,若合法,就接受请求,否则拒绝请求

4. 实现步骤

下面给出四个步骤来实现 JWT 授权认证。

4.1 添加依赖包

在 .Net Core 中实现 JWT 授权认证,需要添加 System.IdentityModel.Tokens.JwtMicrosoft.AspNetCore.Authentication.JwtBearer 两个依赖包。通过以下命令行实现:

dotnet add package System.IdentityModel.Tokens.Jwt
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer

4.2 添加服务

Startup.cs 文件的 ConfigureServices() 方法中添加以下步骤:

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"]))
        };
});

4.3 添加授权

ConfigureServices() 方法中,添加授权:

services.AddAuthorization(options => {
    options.AddPolicy("JwtAuth", policy => {
        policy.AuthenticationSchemes.Add(JwtBearerDefaults.AuthenticationScheme);
        policy.RequireAuthenticatedUser();
    });
});

4.4 生成 JWT

private string GenerateJwtToken(User user, string jwtKey, string jwtIssuer, string jwtAudience, int jwtExpireDays) {
    var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtKey));
    var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);

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

    var token = new JwtSecurityToken(
        issuer: jwtIssuer,
        audience: jwtAudience,
        claims: claims,
        expires: DateTime.UtcNow.AddDays(jwtExpireDays),
        signingCredentials: credentials
    );

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

以上是实现 JWT 授权认证的大部分步骤,可以根据实际情况进行调整。

5. 示例说明

下面举两个示例说明如何使用 JWT 授权认证。

5.1 用户注册

用户在注册时,需要将注册信息发送到服务端,服务端对用户信息进行验证,验证通过则生成 JWT Token,并返回给客户端。客户端以后的每次请求均携带该 Token。

[HttpPost("Register")]
public async Task<IActionResult> Register(User user) {
    if (!ModelState.IsValid) {
        return BadRequest(ModelState);
    }

    var hashedPassword = HashPassword(user.Password);
    user.Password = hashedPassword;

    await _context.Users.AddAsync(user);
    await _context.SaveChangesAsync();

    var jwtToken = GenerateJwtToken(user, Configuration["Jwt:Key"], Configuration["Jwt:Issuer"], Configuration["Jwt:Audience"], int.Parse(Configuration["Jwt:ExpireDays"]));

    return Ok(new { Token = jwtToken });
}

5.2 用户登录

用户登录成功后,提交用户登录信息到服务端,服务端对用户信息进行验证,若用户验证通过,则生成 JWT Token,并返回给客户端。客户端以后的每次请求均携带该 Token。

[HttpPost("Login")]
public async Task<IActionResult> Login(User user) {
    if (!ModelState.IsValid) {
        return BadRequest(ModelState);
    }

    var hashedPassword = HashPassword(user.Password);
    var dbUser = await _context.Users.SingleOrDefaultAsync(u => u.Email == user.Email && u.Password == hashedPassword);

    if (dbUser == null) {
        return Unauthorized();
    }

    var jwtToken = GenerateJwtToken(dbUser, Configuration["Jwt:Key"], Configuration["Jwt:Issuer"], Configuration["Jwt:Audience"], int.Parse(Configuration["Jwt:ExpireDays"]));

    return Ok(new { Token = jwtToken });
}

以上给出了 .Net Core实现JWT授权认证 的完整攻略,并且提供了两个实例说明,希望能够帮到你。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:.Net Core实现JWT授权认证 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • JavaScript面向对象分层思维全面解析

    下面我将和您详细讲解“JavaScript面向对象分层思维全面解析”的完整攻略。 什么是JavaScript面向对象分层思维 JavaScript面向对象分层思维是一种针对JavaScript编程语言的面向对象设计模式。它将对象分为三个层次:业务层、数据层和界面层。每个层次都有自己独特的对象和属性。在JavaScript面向对象分层思维中,每个层次都是相互独…

    C# 2023年5月31日
    00
  • ASP.NET Core MVC 从入门到精通之初窥门径

    随着技术的发展,ASP.NET Core MVC也推出了好长时间,经过不断的版本更新迭代,已经越来越完善,本系列文章主要讲解ASP.NET Core MVC开发B/S系统过程中所涉及到的相关内容,适用于初学者,在校毕业生,或其他想从事ASP.NET Core MVC 系统开发的人员,仅供学习分享使用。   什么是MVC?   MVC是一种架构模式,也是一种设…

    C# 2023年4月18日
    00
  • C#中@字符d是个什么意思

    在 C# 中,@ 符号一般用于声明一个字符串字面量。具体来说,使用@符号声明的字符串被称为“verbatim string”,或者简称为“verbatim”,意为“逐字的”,也就是说,它在代码中表示的字符串的字面值就是它本身的含义,不需要对其中的反斜杠、引号进行转义。 举个例子,下面两行字符串字面值的值是相同的: string s1 = "C:\\…

    C# 2023年6月8日
    00
  • 如何在C# 中查找或结束程序域中的主、子进程

    如何在C# 中查找或结束程序域中的主、子进程 在C#中可以使用Process类来查找、启动和结束进程。Process类封装了与操作系统进程相关的一些API,并提供了简便的方法来管理和控制进程。以下是有关如何在C#中查找或结束程序域中主、子进程的攻略: 查找主进程 首先,我们要通过获取当前进程的进程ID,来查找主进程。在C#中,可以使用 Process.Get…

    C# 2023年6月6日
    00
  • 基于JQuery的asp.net树实现代码

    首先,我们需要明确asp.net树实现的基本原理:树结构的展示是基于DOM的树状结构展示,而实现用户对树节点的交互就需要借助JavaScript的DOM操作能力。JQuery是一款十分适合DOM操作的JavaScript框架,因此使用JQuery可以让我们方便地实现asp.net树的开发。 接下来,我们可以按以下步骤来实现基于JQuery的asp.net树:…

    C# 2023年5月31日
    00
  • C#如何访问共享文件夹或者磁盘

    下面是关于如何在C#中访问共享文件夹或磁盘的完整攻略。 访问共享文件夹 访问共享文件夹需要知道目标文件夹的网络路径以及必要的访问权限。以下是访问共享文件夹的示例代码: using System.IO; string sharedFolderPath = @"\\SERVER\ShareFolder"; // 共享文件夹的网络路径 stri…

    C# 2023年6月1日
    00
  • .NET Core/Framework如何创建委托大幅度提高反射调用的性能详解

    .NET Core/Framework如何创建委托大幅度提高反射调用的性能详解 在.NET Core/Framework中,反射调用是一种非常常见的技术,但是反射调用的性能通常比直接调用方法要低。为了提高反射调用的性能,我们可以使用委托来代替反射调用。在本文中,我们将详细讲解如何使用委托来提高反射调用的性能。 反射调用的性能问题 在.NET Core/Fra…

    C# 2023年5月16日
    00
  • c# 获取网页中指定的字符串信息的实例代码

    获取网页中指定的字符串信息,可以通过c#中的正则表达式(Regex)实现。下面是详细的攻略流程: 1.获取网页内容 首先需要获取要处理的网页内容,可以使用c#中的http请求实现。具体的代码如下: using System.Net; //创建HttpWebRequest对象 HttpWebRequest request = (HttpWebRequest)W…

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