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日

相关文章

  • android通过Location API显示地址信息的实现方法

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

    云计算 2023年5月16日
    00
  • 将个人计算机中的文件备份到腾讯云对象存储

    作者介绍 田嵩,腾讯云Web前端专家工程师,现负责腾讯云对象存储生态与开发者工作 数据无价,相信很多人都深有体会。数码照片、电子文档、工作产出、游戏存档,哪一样都丢不起。 而实际工作和生活中,可能会遇到如下问题: 硬盘故障导致文件丢失 人为的误操作、计算机宕机或软件崩溃导致单一文件丢失 被要求“回滚版本”,却发现没有保存历史版本 这些令人头疼不已的问题,时刻…

    云计算 2023年4月13日
    00
  • .NET 6开发TodoList应用之实现ActionFilter

    下面是“.NET 6开发TodoList应用之实现ActionFilter”的完整攻略。 前言 在Web应用的开发中,ActionFilter 可以帮助我们在请求流程中执行一些共享的逻辑,例如,身份验证、日志记录、全局异常处理等等。使用ActionFilter 可以将这些逻辑隔离到一个独立的类中,使得各个控制器方法之间耦合度更低,代码复用更高效。 在后续的示…

    云计算 2023年5月17日
    00
  • 第五届全球云计算暨国际网络通信展览会,不见不散!

    点击上方“中国云报”可关注! 满腹顶尖技术,不与全世界分享? 来这里,可以给您一个舞台 尽情发表您的真知灼见 有机会成为行业风向标 这里,是6000名云生态链业内人士齐聚圣地 这里,有您最想见的老朋友、新朋友 这里,就是 第五届全球云计算暨国际网络通信展览会·中国站 5月17日前,提交您的演讲主题 让我们见识您的风采吧! Come On!     随着云平台…

    云计算 2023年4月13日
    00
  • 云计算由哪几部方构成,云计算发展主要面临哪些挑战?

    云客户端,如iPhone、Firefox、Android等这类终端设备; 云应用,如GoogleApps、Salesforce、Facebook等应用服务提供商; 云平台,如MicrosoftAzure,GoogleAppEngine等大型平台服务提供商; 云基础设施,如GoGrid,AmazonEC2,SunGrid等基础设施供应商。 而其工作模式分为三种…

    云计算 2023年4月13日
    00
  • .Net Core服务治理Consul搭建集群

    下面是关于“.Net Core服务治理Consul搭建集群”的完整攻略,包含两个示例说明。 简介 Consul是一种服务发现和配置工具,可以帮助我们更好地管理和治理微服务。在本攻略中,我们将介绍如何使用Consul搭建.Net Core服务治理集群,包括安装Consul、创建服务、注册服务、发现服务等步骤。 步骤 在使用Consul搭建.Net Core服务…

    云计算 2023年5月16日
    00
  • KubeSphere 助力提升研发效能的应用实践分享

    作者:卢运强,主要从事 Java、Python 和 Golang 相关的开发工作。热爱学习和使用新技术;有着十分强烈的代码洁癖;喜欢重构代码,善于分析和解决问题。原文链接。 我司从 2022 年 6 月开始使用 KubeSphere,到目前为止快一年时间,简要记录下此过程中的经验积累,供大家参考。 背景 公司当前有接近 3000 人的规模,主要业务为汽车配套…

    云计算 2023年4月20日
    00
  • Python爬取奶茶店数据分析哪家最好喝以及性价比

    针对这个问题,我会从以下几个方面进行详细讲解: 数据采集 数据分析 性价比计算 最终结论 1. 数据采集 为了获取奶茶店的相关数据,需要进行数据采集。在Python中,常用的数据采集库有requests、urllib和scrapy。这里以requests库为例。 首先,需要确定数据采集的目标网站。在本例中,我们选取了三个常见的奶茶品牌:喜茶、奈雪の茶和清茶饮…

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