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

相关文章

  • 在VS2017中用C#调用python脚本的实现

    这里提供了一种寻常的方法,在VS2017中通过C#调用Python脚本的实现,具体过程如下: 准备工作 安装 Python3.x 及 pip,并添加环境变量; 安装 Python 的 C++ 接口库:pip install pybind11; 安装 Python 的包管理器 pipenv:pip install pipenv; 新建一个 .NET Frame…

    C# 2023年5月15日
    00
  • c#反射机制学习和利用反射获取类型信息

    C#反射机制学习和利用反射获取类型信息 反射是C#语言中的一种高级特性,它允许程序在运行时查看和操作代码中的类型、属性和方法。开发人员可以利用反射获取类型信息,并创建对象、调用方法或访问属性,这使得程序的代码更加动态和灵活。 反射的基本概念 类型、程序集和命名空间 在C#中,类型是指类、接口、枚举、结构体等定义。程序集是一组关联的类型,可以打包为DLL或EX…

    C# 2023年5月15日
    00
  • C#集合之不变集合的用法

    C#集合之不变集合的用法 C#中的不变集合(Immutable Collection)是指一旦创建,就不能再添加、删除或更改其元素的集合。在多线程编程和函数式编程中,不变集合被广泛应用。C#中的不变集合包括ImmutableList、ImmutableDictionary、ImmutableSortedSet等,下面我们将详细讲解不变集合的用法。 不变集合的…

    C# 2023年6月8日
    00
  • C# 中对象序列化XML的方法

    C# 中对象序列化 XML 方法概述 C# 中对象序列化 XML 的方法可以将对象以 XML 文件的形式序列化并保存在磁盘上,也可以将 XML 文件反序列化成对象。这种方法可以方便地在不同的系统之间传输数据,并且保留了对象的结构和属性。C# 中对象序列化 XML 的方法主要有以下两种: 使用 XmlSerializer 类进行序列化和反序列化。 使用 Dat…

    C# 2023年5月31日
    00
  • C#从控制台读取字符串的方法

    接下来我将详细讲解“C#从控制台读取字符串的方法”。 什么是控制台? 控制台是计算机的一个系统软件,是一种在电脑上进行字符用户界面操作的应用程序,小巧、直观、灵活,是程序员和IT技术人员日常使用的一个工具。在Windows系统上,通过Win+R打开运行窗口,然后输入“cmd”就能打开控制台。 C#中如何从控制台读取字符串? 在C#中,我们可以使用Consol…

    C# 2023年6月8日
    00
  • ASP .NET Core API发布与部署以及遇到的坑和解决方法

    ASP .NET Core API发布与部署以及遇到的坑和解决方法 在ASP .NET Core应用程序中,发布和部署API是一项非常重要的任务。在本攻略中,我们将介绍ASP .NET Core API发布与部署的方法,并提供两个示例说明。 1. 发布API 在ASP .NET Core应用程序中,发布API可以使用Visual Studio或者命令行工具进…

    C# 2023年5月16日
    00
  • C# 对象映射的高性能方案

    C# 对象映射(Object Mapping)是指将数据库中的数据映射到 C# 对象中,或将 C# 对象中的数据映射到数据库中。常见的应用场景包括数据访问层,ORM(Object Relational Mapping)框架等。在实际应用中,对象映射的性能非常重要,因为它涉及到数据访问效率的问题。本文将提出一种高性能的 C# 对象映射方案,旨在提高数据访问的效…

    C# 2023年6月1日
    00
  • Angular4 反向代理Details实践

    Angular是一种流行的Web应用程序框架,它提供了许多功能和工具来帮助开发人员构建高效的Web应用程序。在开发Angular应用程序时,我们可能需要使用反向代理来解决跨域请求的问题。本文将提供详解“Angular4反向代理Details实践”的完整攻略,包括如何配置反向代理、如何在Angular应用程序中使用反向代理等。 配置反向代理 要配置反向代理,我…

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