asp net core2.1如何使用jwt从原理到精通(二)

下面我将给出详细讲解“asp net core2.1如何使用jwt从原理到精通(二)”的完整攻略:

1. 了解JWT基本原理

JWT(JSON Web Tokens)是一个开放标准(RFC 7519),它定义了用于在网络上传输数据的一种紧凑且自包含的方式。因为信息是使用数字签名的方式进行验证的,所以它是可信的。JWT由三个部分组成:头部、负载和签名。其中,头部和负载都是base64编码后的字符串,签名是由头部、负载和密钥生成的加密字符串。头部和负载中间用一个“.”号分开。

使用JWT的过程如下:

  1. 客户端向服务端发送用户名和密码
  2. 服务端验证用户名和密码是否正确,如果正确,则生成JWT并返回给客户端
  3. 客户端接收到JWT后,将其存储在本地
  4. 客户端在每次请求时,都将JWT作为请求头发送给服务端
  5. 服务端验证JWT的合法性,如果验证通过,则返回请求内容

2. asp net core2.1如何使用jwt

在具体实现中,首先要安装Microsoft.AspNetCore.Authentication.JwtBearer包。然后,在Startup.cs中的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
    };
});

以上代码的作用是告诉系统使用JWT验证,在TokenValidationParameters中定义JWT的验证规则。IssuerSigningKey表示加密密钥,我们可以将其保存在配置文件中,使其可以在不同的环境中进行配置。

然后在Configure方法中启用验证:

app.UseAuthentication();

接下来可以编写API接口了。以一个获取用户信息的接口为示例,代码如下:

[Authorize]
[HttpGet]
public IActionResult GetUser()
{
    // 获取当前用户Id
    var userId = int.Parse(User.FindFirst(ClaimTypes.NameIdentifier).Value);

    // 从数据库中查询用户信息
    var user = _userRepository.GetUserById(userId);

    // 返回用户信息
    return Ok(user);
}

在接口上添加Authorize属性,表示只有经过验证的用户才能访问该接口。在接口实现中,首先从当前用户的Claims中获取用户Id,然后从数据库中查询用户信息并返回。

3. 示例说明

假设我们有一个用户信息管理系统,用户可以登录查看自己的信息。下面我们演示如何使用JWT实现用户信息的获取。

示例1

首先,用户在登录页面输入用户名和密码:

function login() {
    let username = document.getElementById("username").value;
    let password = document.getElementById("password").value;

    fetch("/api/auth/login", {
        method: "POST",
        headers: {
            "Content-Type": "application/json"
        },
        body: JSON.stringify({ username, password })
    })
    .then(response => response.json())
    .then(data => {
        localStorage.setItem("jwt", data.token);
        // 登录成功,跳转到用户信息页面
        window.location.href = "/user";
    })
    .catch(error => console.error(error));
}

在服务端验证用户名和密码的代码如下:

[HttpPost("login")]
public IActionResult Login(UserForLoginDto userForLoginDto)
{
    // 验证用户名和密码
    var user = _userRepository.Login(userForLoginDto.Username, userForLoginDto.Password);
    if (user == null)
    {
        return Unauthorized();
    }

    // 生成JWT
    var claims = new[]
    {
        new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()),
        new Claim(ClaimTypes.Name, user.Username),
    };
    var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration.GetSection("AppSettings:Token").Value));
    var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha512Signature);
    var tokenDescriptor = new SecurityTokenDescriptor
    {
        Subject = new ClaimsIdentity(claims),
        Expires = DateTime.Now.AddDays(1),
        SigningCredentials = creds
    };
    var tokenHandler = new JwtSecurityTokenHandler();
    var token = tokenHandler.CreateToken(tokenDescriptor);

    // 返回JWT
    return Ok(new { token = tokenHandler.WriteToken(token) });
}

当用户登录成功后,服务端返回JWT,客户端将其保存在localStorage中。每次请求用户信息,客户端都将JWT发送给服务端,服务端验证JWT的合法性,从而保证了数据的安全性。

示例2

除了用户信息管理系统外,我们还可以使用JWT来保护其他的API接口。下面我们演示如何在一个文件管理系统中使用JWT保护文件上传接口。

服务端代码如下:

[Authorize]
[HttpPost("upload")]
public async Task<IActionResult> Upload(IFormFile file)
{
    // 保存文件到本地
    var filePath = Path.Combine("E:\Files", file.FileName);
    using (var fileStream = new FileStream(filePath, FileMode.Create))
    {
        await file.CopyToAsync(fileStream);
    }

    return Ok();
}

在接口上添加Authorize属性,表示只有经过验证的用户才能访问该接口。当用户访问该接口时,请求头中必须包含JWT,否则服务端将返回401错误。

客户端代码如下:

function upload() {
    let jwt = localStorage.getItem("jwt");
    let fileInput = document.getElementById("file");
    let formData = new FormData();
    formData.append("file", fileInput.files[0]);

    fetch("/api/files/upload", {
        method: "POST",
        headers: {
            "Authorization": `Bearer ${jwt}`
        },
        body: formData
    })
    .then(response => {
        if (response.ok) {
            alert("文件上传成功");
        } else {
            alert("文件上传失败");
        }
    })
    .catch(error => console.error(error));
}

在发送请求时,客户端将JWT作为Authorization请求头发送给服务器,以便验证其是否有权限上传文件。

以上就是“asp net core2.1如何使用jwt从原理到精通(二)”的完整攻略,其中包含了两个实际的示例。希望对你有所帮助!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:asp net core2.1如何使用jwt从原理到精通(二) - Python技术站

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

相关文章

  • 【学习总结】Master课程 之 虚拟化与云计算

    Section 1- Cloud Computing Introduction-云计算介绍 1-What can Cloud Computing do? – 云计算可以做什么? 服务模式:美国国家标准和技术研究院的云计算定义中明确了三种服务模式: 软件即服务(SaaS): 消费者使用应用程序,但并不掌控操作系统、硬件或运作的网络基础架构。是一种服务观念的基础…

    2023年4月9日
    00
  • 解析OpenSSL程序概念及震惊业界的“心脏出血”漏洞

    解析OpenSSL程序概念及“心脏出血”漏洞攻略 OpenSSL程序概念 OpenSSL是一套开放源代码的加密类库,提供了多种加密算法和协议功能,能够支持SSL/TLS协议,而且应用广泛。其架构包括四层:应用程序接口层(API)、SSL/TLS层、加密层和基础支持层。其中SSL/TLS层是OpenSSL程序的核心,正是这一层实现了HTTPS协议以及其他安全协…

    云计算 2023年5月18日
    00
  • 云计算笔记(一):基础概念

    本文用于收集和整理云计算设计的概念。 现在的云计算有些过热(“人人都在谈论它,但没有人真正知道它”),很多研究都挂上了这个名词来显示其时髦。从某种意义上讲:云计算is nothing new,只是概念的创造。重新整理了网络资源,特别适合与运营商(包括亚马逊)来整理他们的产品和服务。云计算提供了很好的梳理,梳理了信息内容提供和信息获取途径 。而云这个概念sel…

    云计算 2023年4月12日
    00
  • C#基于Linq和反射实现数据持久化框架Xml4DB详解

    下面是关于“C#基于Linq和反射实现数据持久化框架Xml4DB详解”的完整攻略,包含两个示例说明。 简介 Xml4DB是一个基于Linq和反射实现的数据持久化框架,可以将对象序列化为XML格式并保存到文件中。在本攻略中,我们将介绍如何使用Xml4DB框架来实现数据持久化,包括创建数据模型、保存数据、读取数据等步骤。 步骤 在使用Xml4DB框架进行数据持久…

    云计算 2023年5月16日
    00
  • ASP.NET Core使用自定义验证属性控制访问权限详解

    ASP.NET Core使用自定义验证属性控制访问权限详解 在 ASP.NET Core 中,自定义验证属性是一种非常常用的方法来控制访问权限,可以通过在代码中使用不同的验证方法来实现不同的访问权限控制。本篇攻略将介绍 ASP.NET Core 中如何使用自定义验证属性控制访问权限。 什么是自定义验证属性 自定义验证属性是一种 ASP.NET Core 中用…

    云计算 2023年5月17日
    00
  • QT自定义QTextEdit实现大数据的实时刷新显示功能实例

    下面我会详细讲解一下”QT自定义QTextEdit实现大数据的实时刷新显示功能实例”的攻略和示例。 简介 在实际开发中,我们经常需要在界面中展示大量的数据,而且还需要实现实时刷新功能。而QTextEdit可以实现富文本的在线编辑,所以可用于实现大数据的实时刷新显示,在此分享一下我使用QT自定义QTextEdit实现大数据的实时刷新显示的完整攻略。 实现步骤 …

    云计算 2023年5月18日
    00
  • asp.net core系列之模型绑定和验证方法

    下面是关于“ASP.NET Core系列之模型绑定和验证方法”的完整攻略,包含两个示例说明。 简介 在ASP.NET Core中,模型绑定和验证是Web应用程序中的重要组成部分。模型绑定是指将HTTP请求中的数据绑定到应用程序中的模型对象上,而验证是指对模型对象进行验证,以确保其符合应用程序的要求。在本攻略中,我们将介绍ASP.NET Core中的模型绑定和…

    云计算 2023年5月16日
    00
  • ADN新开了云计算Cloud和移动计算Mobile相关技术的博客

    除了面向AutoCAD,基础设施,建筑业和机械制造业之外的DevBlog之外,ADN又新开了云计算Cloud和移动计算Mobile相关技术的博客,欢迎大家订阅,地址是http://adndevblog.typepad.com/cloud_and_mobile/  

    云计算 2023年4月13日
    00
合作推广
合作推广
分享本页
返回顶部