下面我将给出详细讲解“asp net core2.1如何使用jwt从原理到精通(二)”的完整攻略:
1. 了解JWT基本原理
JWT(JSON Web Tokens)是一个开放标准(RFC 7519),它定义了用于在网络上传输数据的一种紧凑且自包含的方式。因为信息是使用数字签名的方式进行验证的,所以它是可信的。JWT由三个部分组成:头部、负载和签名。其中,头部和负载都是base64编码后的字符串,签名是由头部、负载和密钥生成的加密字符串。头部和负载中间用一个“.”号分开。
使用JWT的过程如下:
- 客户端向服务端发送用户名和密码
- 服务端验证用户名和密码是否正确,如果正确,则生成JWT并返回给客户端
- 客户端接收到JWT后,将其存储在本地
- 客户端在每次请求时,都将JWT作为请求头发送给服务端
- 服务端验证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技术站