.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日

相关文章

  • C#中多态现象和多态的实现方法

    下面来详细讲解一下”C#中多态现象和多态的实现方法”的攻略。 什么是多态? 多态,英文名为Polymorphism,是指在面向对象编程中,同一种行为表现出不同的形态和用途,也是一种很强大的面向对象编程特性。 在实际应用中,多态通常指的是一个变量(或参数、返回值等)能够具有多种类型,且能够根据不同的类型而呈现出多种不同的行为的能力,这种能力通常是通过继承、重载…

    C# 2023年6月7日
    00
  • asp.net 文件下载功能函数代码整理

    我来为您详细讲解如何整理“ASP.NET文件下载功能函数代码”。 1. 准备工作 在开始整理代码之前,我们需要先创建一个空白的ASP.NET Web应用程序,以及在应用程序中添加文件下载功能所需要的按钮和相关控件。 2. 在代码中添加文件下载功能函数 我们可以在C#代码中添加文件下载功能函数,使我们能够在需要的地方直接调用该函数来实现文件下载。下面是一个简单…

    C# 2023年5月31日
    00
  • C#简单实现表达式目录树(Expression)

    下面是我对于“C#简单实现表达式目录树(Expression)”的完整攻略。 表达式目录树简介 表达式目录树是一个树形结构,可以用来表示 LINQ 查询和 Lambda 表达式。表达式目录树将表达式树转换为运行时的委托,从而实现了高效的查询。在表达式目录树中,每个节点都表示一个表达式,可以是参数、常量、变量、运算符等。表达式目录树不仅能用于构建查询,还可以用…

    C# 2023年5月31日
    00
  • .net发送邮件实现代码

    下面是 “.NET发送邮件实现代码” 的完整攻略: 步骤一:导入命名空间 在代码中使用邮件发送的功能,需要导入命名空间System.Net.Mail。在C#代码中,可以使用以下语句导入: using System.Net.Mail; 步骤二:创建MailMessage对象 在邮件发送前,需要创建一个MailMessage对象,并设置其属性值,包括收件人、发件…

    C# 2023年5月31日
    00
  • C#中DateTime函数的详细用法

    下面是关于C#中DateTime函数的详细用法: 1. DateTime函数的概述 DateTime是C#中用于操作日期和时间的一个结构体类型,在.NET Framework中属于System命名空间,通常用于表示和操作当前日期和时间或指定日期和时间对象。它可以表示的日期和时间范围为公元1年1月1日00:00:00到公元9999年12月31日23:59:59…

    C# 2023年6月1日
    00
  • 如何通过C#/VB.NET 代码调整PDF文档的页边距

    PDF边距是页面主要内容区域和页面边缘之间的距离。与Word页边距不同,PDF文档的页边距很难更改。因为Adobe没有提供操作页边距的直接方法。但是,您可以通过缩放页面内容来改变页边距。本文将介绍如何在不更改页面大小的情况下使用C#/VB.NET 代码调整PDF文档的页边距。 增加PDF文档的页边距 缩短PDF文档的页边距 增加PDF文档的页边距 扩大PDF…

    C# 2023年4月27日
    00
  • 武装你的WEBAPI-OData与DTO

    本文属于OData系列文章 Intro 前面写了很多有关OData使用的文章,很多读者会有疑问,直接将实体对象暴露给最终用户会不会有风险?$expand在默认配置的情况下,数据会不会有泄露风险? 答案是肯定的,由于OData的特性,提供给我们便捷同时也会带来一些风险。很多地方推荐使用DTO模式来隔离实体类与最终用户使用到类的关系,从而解决以上两个问题,ODa…

    C# 2023年5月8日
    00
  • 基于C#中IDisposable与IEnumerable、IEnumerator的应用

    接下来我将详细讲解基于C#中IDisposable与IEnumerable、IEnumerator的应用,包括它的概念、用处及实际应用等相关知识。 一、IDisposable 在C#中,IDisposable是一个接口,它定义了一种机制,用于释放非托管资源以及可选地释放托管资源。一个类通过实现IDisposable接口,并提供Dispose方法来实现资源的释…

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