.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#中的Expression

    带你一文了解C#中的Expression 什么是Expression 在C#中,Expression是一个抽象类,它代表了一个包含单个值、操作符、变量、方法调用或属性访问等逻辑的树形结构。 Expression对象可以被应用于以程序方式表示代码逻辑的情况,通常被用于了解程序上下文、编译代码或构建API。具体来说,Expression很常用于Lambda表达式…

    C# 2023年6月1日
    00
  • C#常用正则验证函数示例

    细致讲解C#常用正则验证函数示例的攻略的过程中我会给出两条示例说明。 标题 我们先来给这篇文章加上合适的标题: C#常用正则验证函数示例 前言 正则表达式是一种非常强大的文本处理工具,使用正则表达式可以快速、方便地实现复杂的文本校验、过滤和替换等操作。在C#编程中,正则表达式也是非常常用的一种技术手段。在本篇文章中,我们将介绍一些C#中常用的正则表达式验证函…

    C# 2023年6月8日
    00
  • C#实现装箱与拆箱操作简单实例

    C#实现装箱与拆箱操作简单实例 什么是装箱与拆箱 C#中,装箱(boxing)指的是将一个值类型(比如int、float等)转换为一个对象类型(比如object类型、ValueType类型等),拆箱(unboxing)则是相反的过程,将一个对象类型转换为值类型。 装箱和拆箱操作可以在对内存性能要求较高的情况下对程序性能造成影响,因此需要慎重使用。 如何实现装…

    C# 2023年6月6日
    00
  • 简单掌握Windows中C#启动外部程序进程的方法

    下面我将详细介绍如何在Windows中使用C#启动外部程序进程的方法。 1. 引用命名空间 在使用C#启动外部程序进程前,需要先引用System.Diagnostics命名空间,该命名空间包含了一个名为Process的类,用于处理进程相关操作。 using System.Diagnostics; 2. 创建Process对象 创建Process对象是启动外部…

    C# 2023年6月7日
    00
  • 详解如何在C#中接受或拒绝Excel中的修订

    如何在C#中接受或拒绝Excel中的修订 为了接受或拒绝Excel文档中的修订,我们需要使用C#中的Microsoft.Office.Interop.Excel库。下面是实现此目的的步骤: 步骤1:在Visual Studio中创建C#项目,并添加对Microsoft.Office.Interop.Excel库的引用 步骤2:打开Excel文档 为了打开Ex…

    C# 2023年6月6日
    00
  • C#文字换行的实现方法

    以下是关于“C#文字换行的实现方法”的详细讲解: 什么是C#文字换行? 在C#编程中,当需要一个字符串在多行上显示时,就需要用到文字换行。文字换行就是指当字符串中出现了换行符(\n),文字就会跳到下一行续写,从而形成多行的字符串。 C#文字换行的实现方法 方法1:使用\n换行符 在C#中,可以通过在字符串中添加\n来实现文字的换行,具体代码如下: strin…

    C# 2023年6月8日
    00
  • C#中使用反射遍历一个对象属性及值的小技巧

    下面我将详细讲解如何使用反射遍历一个对象属性及值的小技巧。 步骤一:导入命名空间 使用反射需要导入System.Reflection命名空间,可以通过以下方式导入: using System.Reflection; 步骤二:获取对象的类型 首先,需要获取待遍历对象的类型,可以通过以下代码获取: var type = obj.GetType(); 其中,obj…

    C# 2023年6月1日
    00
  • C#基础之委托用法实例教程

    下面就是关于 “C#基础之委托用法实例教程” 的完整攻略: 1. 什么是委托? 委托(Delegate)是一种类,它用于定义方法的类型,一个委托类可以搭载一个或多个方法。委托可以看作是C++中函数指针的升级版。C#编译器可以将一个委托引用的方法看做一个普通的方法,所以委托也可以称为类型安全的回调。 2. 委托的定义和使用 委托的定义 定义委托的语法格式如下:…

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