ASP.NET Core Token认证是一种常见的身份验证机制,它使用JSON Web Token(JWT)来验证用户身份。本文将详细讲解ASP.NET Core Token认证的使用方法及项目实战。
什么是ASP.NET Core Token认证?
ASP.NET Core Token认证是一种基于JWT的身份验证机制。JWT是一种开放标准,它定义了一种紧凑且自包含的方式来在各方之间安全地传输信息。JWT由三部分组成:头部、载荷和签名。头部包含了令牌的类型和加密算法,载荷包含了一些声明信息,例如用户ID和过期时间,签名用于验证令牌的完整性。
ASP.NET Core Token认证使用JWT来验证用户身份。当用户登录时,服务器会生成一个JWT并将其发送给客户端。客户端在后续请求中将JWT作为Authorization头的Bearer令牌发送给服务器。服务器使用密钥验证JWT的完整性,并从中提取用户信息。
ASP.NET Core Token认证的使用方法
ASP.NET Core Token认证的使用方法如下:
- 添加JWT支持
在ASP.NET Core应用程序中使用JWT,需要添加Microsoft.AspNetCore.Authentication.JwtBearer NuGet包。可以使用以下命令将其添加到项目中:
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
- 配置JWT选项
在Startup.cs文件中的ConfigureServices方法中配置JWT选项。例如,以下代码配置了JWT选项:
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = "mydomain.com",
ValidAudience = "mydomain.com",
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("mysecretkey"))
};
});
// ...
}
在上面的代码中,我们使用AddAuthentication方法添加JWT身份验证,并使用AddJwtBearer方法配置JWT选项。在TokenValidationParameters属性中,我们指定了JWT的验证规则,例如验证颁发者、受众、过期时间和签名密钥。
- 启用身份验证
在Startup.cs文件中的Configure方法中启用身份验证。例如,以下代码启用了身份验证:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseAuthentication();
// ...
}
在上面的代码中,我们使用UseAuthentication方法启用了身份验证。
- 生成JWT
在ASP.NET Core应用程序中生成JWT,可以使用Microsoft.IdentityModel.Tokens NuGet包。可以使用以下命令将其添加到项目中:
dotnet add package Microsoft.IdentityModel.Tokens
例如,以下代码演示了如何生成JWT:
public string GenerateJwtToken(User user)
{
var tokenHandler = new JwtSecurityTokenHandler();
var key = Encoding.ASCII.GetBytes("mysecretkey");
var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(new Claim[]
{
new Claim(ClaimTypes.Name, user.Username),
new Claim(ClaimTypes.Email, user.Email)
}),
Expires = DateTime.UtcNow.AddDays(7),
SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
};
var token = tokenHandler.CreateToken(tokenDescriptor);
return tokenHandler.WriteToken(token);
}
在上面的代码中,我们使用JwtSecurityTokenHandler类生成JWT。在SecurityTokenDescriptor对象中,我们指定了JWT的主题、过期时间和签名密钥。
- 验证JWT
在ASP.NET Core应用程序中验证JWT,可以使用以下代码:
[Authorize]
public IActionResult MyProtectedAction()
{
// Do something...
}
在上面的代码中,我们使用Authorize属性标记了MyProtectedAction方法,表示该方法需要身份验证。如果客户端发送的JWT无效或已过期,则服务器将返回401状态码。
ASP.NET Core Token认证的项目实战
以下是两个示例,演示如何在ASP.NET Core项目中使用Token认证。
示例一:生成和验证JWT
在这个示例中,我们将演示如何生成和验证JWT。
- 创建控制器
创建一个名为“TokenController”的控制器,用于生成和验证JWT。例如,以下代码创建了一个名为“TokenController”的控制器:
[ApiController]
[Route("[controller]")]
public class TokenController : ControllerBase
{
private readonly IUserService _userService;
public TokenController(IUserService userService)
{
_userService = userService;
}
[HttpPost]
public IActionResult GenerateToken([FromBody] LoginModel model)
{
var user = _userService.Authenticate(model.Username, model.Password);
if (user == null)
{
return Unauthorized();
}
var token = GenerateJwtToken(user);
return Ok(new { Token = token });
}
[Authorize]
[HttpGet]
public IActionResult ValidateToken()
{
return Ok();
}
private string GenerateJwtToken(User user)
{
var tokenHandler = new JwtSecurityTokenHandler();
var key = Encoding.ASCII.GetBytes("mysecretkey");
var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(new Claim[]
{
new Claim(ClaimTypes.Name, user.Username),
new Claim(ClaimTypes.Email, user.Email)
}),
Expires = DateTime.UtcNow.AddDays(7),
SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
};
var token = tokenHandler.CreateToken(tokenDescriptor);
return tokenHandler.WriteToken(token);
}
}
在上面的代码中,我们创建了一个名为“TokenController”的控制器。在GenerateToken方法中,我们使用IUserService接口验证用户凭据,并生成JWT。在ValidateToken方法中,我们使用Authorize属性标记了该方法,表示该方法需要身份验证。
- 创建UserService
创建一个名为“UserService”的服务,用于验证用户凭据。例如,以下代码创建了一个名为“UserService”的服务:
public interface IUserService
{
User Authenticate(string username, string password);
}
public class UserService : IUserService
{
private readonly List<User> _users = new List<User>
{
new User { Id = 1, Username = "user1", Password = "password1", Email = "user1@example.com" },
new User { Id = 2, Username = "user2", Password = "password2", Email = "user2@example.com" }
};
public User Authenticate(string username, string password)
{
var user = _users.SingleOrDefault(x => x.Username == username && x.Password == password);
if (user == null)
{
return null;
}
return new User { Id = user.Id, Username = user.Username, Email = user.Email };
}
}
public class User
{
public int Id { get; set; }
public string Username { get; set; }
public string Password { get; set; }
public string Email { get; set; }
}
在上面的代码中,我们创建了一个名为“UserService”的服务。在Authenticate方法中,我们验证用户凭据并返回用户对象。
- 测试JWT
启动应用程序并使用Postman或其他HTTP客户端发送POST请求到“/token”路由,包含用户名和密码。例如,以下请求:
POST /token HTTP/1.1
Host: localhost:5000
Content-Type: application/json
{
"username": "user1",
"password": "password1"
}
如果凭据有效,则服务器将返回JWT。然后,使用相同的HTTP客户端发送GET请求到“/token”路由,并在Authorization头中包含JWT。例如,以下请求:
```http
GET /token HTTP/1.1
Host: localhost:5000
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c2VyMSIsImVtYWlsIjoidXNlcjFAZXhhbXBsZS5jb20iLCJleHAiOjE2MjIwMjMwMzAsImlzcyI6Im15ZG9tYWluLmNvbSIsImF1ZCI6Im15ZG9tYWluLmNvbSJ9.5JZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZ
JZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZ
JZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJ
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解ASP.NET Core Token认证 - Python技术站