关于"C#关于JWT跨域身份验证的实现代码"的攻略,我们可以从以下几个方面展开讲解:
- 什么是JWT跨域身份验证
- JWT的结构
- 使用C#实现JWT跨域身份验证
- 示例代码
什么是JWT跨域身份验证?
经典的客户端身份验证方法是Cookie和Session,但是该方法有一些缺陷。一个替代方案是JWT,它能够高效并安全地在客户端和服务器之间进行身份验证。JWT(JSON Web Token)是由JSON对象组成的字符串,用于安全地将用户信息传递到服务器。它由三个部分组成:Header、Payload和Signature。Header描述了令牌的类型和摘要算法。Payload包含了用户的信息。Signature是使用密钥和摘要算法生成的哈希值,确保令牌在传输过程中不被篡改。
JWT的结构
JWT由三个部分组成,每个部分都以Base64编码的字符串表示,并用“.”作为分隔符。例如:xxxxxx.yyyyyy.zzzzzz
- Header,JSON格式,用于描述JWT的元数据,它包含两个属性:alg和typ,分别代表签名的算法和JWT本身的类型。
- Payload,JSON格式,用于存储有价值的信息。又称Claims,分为标准Claims、公共Claims和私有Claims三类。
- Signature,使用Header和Payload组成的字符串加上一个Secret Key使用指定的算法生成的签名,用于验证消息的完整性。
使用C#实现JWT跨域身份验证
下面是使用C#实现JWT跨域身份验证的步骤:
1. 安装JWT库
通过NuGet包管理器快速安装Microsoft.AspNetCore.Authentication.JwtBearer
2. 配置JWT服务
在Startup配置文件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
};
});
此处配置了JwtBearer中间件,并指定了TokenValidationParameters的相关参数。
3. 配置身份验证中间件
在Startup配置文件Configure方法中添加以下代码:
app.UseAuthentication();
4. 生成JWT Token
创建一个AuthController,并添加以“api/auth”作为前缀的路由,添加登录Post请求方法
[Route("api/auth")]
[ApiController]
public class AuthController : ControllerBase
{
private readonly IConfiguration _config;
public AuthController(IConfiguration config)
{
_config = config;
}
[HttpPost("login")]
public IActionResult Login([FromBody]UserModel login)
{
IActionResult response = Unauthorized();
var user = AuthenticateUser(login);
if (user != null)
{
var tokenString = GenerateJWTToken(user);
response = Ok(new { token = tokenString });
}
return response;
}
//Auth Api Method
}
在Login方法中,我们调用AuthenticateUser方法来验证用户的身份。如果用户名和密码正确,则会调用GenerateJWTToken方法来生成JWT Token并返回给客户端。GenerateJWTToken方法将使用SymmetricSecurityKey在Header和Payload中添加相关信息,并生成哈希签名添加到Token的尾部。
private string GenerateJWTToken(UserModel userInfo)
{
var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["Jwt:SecretKey"]));
var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);
var claims = new[]
{
new Claim(JwtRegisteredClaimNames.Sub, userInfo.UserID),
new Claim(JwtRegisteredClaimNames.Email, userInfo.EmailAddress),
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
};
var token = new JwtSecurityToken(
issuer: _config["Jwt:Issuer"],
audience: _config["Jwt:Issuer"],
claims: claims,
expires: DateTime.Now.AddMinutes(20),
signingCredentials: credentials);
return new JwtSecurityTokenHandler().WriteToken(token);
}
5. 使用JWT Token认证
在需要进行身份验证的Controller或Action中添加以下特性
[Authorize]
public class UsersController : ControllerBase
{
// users controller apis
}
使用[Authorize]特性标记的任何Controller或Action将强制要求用户在访问时提供有效的JWT Token。
示例代码
完整的示例代码是比较长的,其中包括Demo的创建,JWT的生成等内容,我只给出2个大致示例:
1. Startup.cs中的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 = Configuration["JwtConfig:Issuer"],
ValidAudience = Configuration["JwtConfig:Audience"],
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["JwtConfig:Key"]))
};
});
}
2. UsersController.cs中的示例
[Route("api/[controller]")]
[ApiController]
public class UsersController : ControllerBase
{
private readonly IUserRepository _userRepository;
public UsersController(IUserRepository userRepository)
{
_userRepository = userRepository;
}
[HttpGet("{id}")]
[Authorize]
public async Task<ActionResult<UserDto>> Get(int id)
{
var existingUser = await _userRepository.GetByIdAsync(id);
if (existingUser == null)
{
return NotFound();
}
var result = new UserDto
{
...
};
return result;
}
}
如上述示例代码所示,我们可以成功地使用C#代码实现JWT跨域身份验证。需要注意的是,本示例中,我们是在API控制器中直接使用的JWT Token来进行用户身份验证。如果您正在使用标准MVC构架,可以使用其他方式来实现身份验证,并指定JWT值来进行授权。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c#关于JWT跨域身份验证的实现代码 - Python技术站