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日

相关文章

  • PVE Cloud-INIT 模板配置

    PVE Cloud-INIT 模板配置 Cloud-init是什么 Cloud-init是开源的云初始化程序,能够对新创建弹性云服务器中指定的自定义信息(主机名、密钥和用户数据等)进行初始化配置。通过Cloud-init进行弹性云服务器的初始化配置,将对您使用弹性云服务器、镜像服务和弹性伸缩产生影响。简单地讲,cloud-init是一个Linux虚拟机的初始…

    云计算 2023年4月17日
    00
  • 使用vSphere Update Manager 升级 ESXi 主机

    使用vSphere Update Manager 升级 ESXi 主机 vSphere Update Manager  vSphere Update Manager 是用于升级、迁移、更新和修补群集主机、虚拟机和客户机操作系统的软件。 vSphere Update Manager 可协调主机和虚拟机的升级。如果站点使用 vSphere Update Mana…

    云计算 2023年4月17日
    00
  • 阿里云嘉年华:抽奖100%中、气质好的最高可送1000

    阿里云嘉年华抽奖攻略 活动说明 阿里云嘉年华是阿里云举办的一项促销活动,抽奖100%中、气质好的最高可送1000,用户可以在活动期间参与抽奖获得奖励。该活动需要您在阿里云官网登录账号后进入活动主页即可参与,每人每天有3次抽奖机会。 活动规则 活动规则非常简单:用户进入抽奖页面后可以点击“抽奖”按钮进行抽奖,每人每天最多可以抽3次,所以需要合理安排抽奖时间。 …

    云计算 2023年5月17日
    00
  • 高性能计算科研学习,CPU不合适?GPU云服务器强势出击

    GPU云服务器是基于GPU应用的计算服务,目前新睿云有NVIDIA Tesla P100 GPU、NVIDIA Tesla P40 GPU型号GPU云服务器,适用的场景有视频处理、3D图形渲染、深度学习、科学计算等场景。 新睿云P40与P100GPU的区别   1.P40主要负责图像、文字和语音识别 1.1P40的单精运算能力强于P100,计算能力胜于p10…

    云计算 2023年4月13日
    00
  • iOS中设置网络超时时间+模拟的方法详解

    iOS中设置网络超时时间+模拟的方法详解 在iOS开发中,我们经常需要设置网络请求的超时时间,以确保应用程序的稳定性和可靠性。本文将提供一个完整的攻略,包括如何设置网络超时时间和如何模拟网络请求的过程。 设置网络超时时间 在iOS中,我们可以使用NSURLSession来设置网络请求的超时时间。以下是一个示例说明,演示如何设置网络超时时间: let sess…

    云计算 2023年5月16日
    00
  • Angualrjs和bootstrap相结合实现数据表格table

    下面是“Angularjs和Bootstrap相结合实现数据表格table”的完整攻略: 1. 引入Bootstrap和Angularjs 首先,在项目中引入Bootstrap和Angularjs的必要文件: <!– bootstrap css 文件 –> <link rel="stylesheet" href=&q…

    云计算 2023年5月18日
    00
  • 云计算系列——HIVE1.2.1 环境搭建

          hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。 其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。   前提          安…

    云计算 2023年4月11日
    00
  • android通过Location API显示地址信息的实现方法

    Android通过Location API显示地址信息的实现方法 在Android应用程序中,有时需要通过Location API获取设备的位置信息,并将其转换为地址信息。本文将提供一个完整的攻略,包括如何使用Location API显示地址信息。以下是详细步骤: 步骤1:获取位置权限 在使用Location API之前,我们需要获取位置权限。以下是一个示例…

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