下面是关于“.Net Core官方JWT授权验证的全过程”的完整攻略,包含两个示例说明。
简介
JSON Web Token(JWT)是一种用于安全地传输信息的开放标准。在.NET Core中,我们可以使用官方的JWT授权验证来实现身份验证和授权。
JWT的基本概念
在使用JWT之前,我们需要了解一些基本概念:
- Header:JWT的头部,用于描述JWT的元数据。
- Payload:JWT的负载,用于存储实际的数据。
- Signature:JWT的签名,用于验证JWT的完整性和真实性。
JWT的使用方法
在.NET Core中,我们可以按照以下步骤来使用JWT:
1. 安装Microsoft.AspNetCore.Authentication.JwtBearer
我们可以使用NuGet包管理器来安装Microsoft.AspNetCore.Authentication.JwtBearer。可以使用以下命令来安装Microsoft.AspNetCore.Authentication.JwtBearer:
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
2. 配置JWT
我们可以在appsettings.json文件中配置JWT。可以使用以下代码来配置JWT:
{
"Jwt": {
"Issuer": "MyIssuer",
"Audience": "MyAudience",
"Key": "MySecretKey"
}
}
在上面的代码中,我们配置了JWT的Issuer、Audience和Key。
3. 添加JWT授权验证
我们可以在Startup类中添加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 = Configuration["Jwt:Issuer"],
ValidAudience = Configuration["Jwt:Audience"],
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:Key"]))
};
});
services.AddControllers();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseAuthentication();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
在上面的代码中,我们使用AddAuthentication方法来添加JWT授权验证,并使用AddJwtBearer方法来配置JWT授权验证的选项。
4. 生成JWT
我们可以使用以下代码来生成JWT:
public string GenerateJwtToken(User user)
{
var tokenHandler = new JwtSecurityTokenHandler();
var key = Encoding.ASCII.GetBytes(Configuration["Jwt:Key"]);
var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(new Claim[]
{
new Claim(ClaimTypes.Name, user.Username),
new Claim(ClaimTypes.Role, user.Role)
}),
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的选项。
5. 验证JWT
我们可以使用以下代码来验证JWT:
[Authorize]
[HttpGet]
public IActionResult Get()
{
var identity = HttpContext.User.Identity as ClaimsIdentity;
var username = identity.FindFirst(ClaimTypes.Name)?.Value;
var role = identity.FindFirst(ClaimTypes.Role)?.Value;
return Ok(new { Username = username, Role = role });
}
在上面的代码中,我们使用Authorize特性来标记需要验证JWT的API,并使用HttpContext.User.Identity属性来获取JWT的信息。
示例
示例1:生成和验证JWT
在本示例中,我们将演示如何使用JWT来生成和验证JWT。我们可以按照以下步骤来实现:
- 创建ASP.NET Core Web API项目:
我们可以使用Visual Studio创建一个名为"JwtExample"的ASP.NET Core Web API项目。
- 安装Microsoft.AspNetCore.Authentication.JwtBearer:
我们可以使用NuGet包管理器来安装Microsoft.AspNetCore.Authentication.JwtBearer。可以使用以下命令来安装Microsoft.AspNetCore.Authentication.JwtBearer:
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
- 配置JWT:
我们可以在appsettings.json文件中配置JWT。可以使用以下代码来配置JWT:
{
"Jwt": {
"Issuer": "MyIssuer",
"Audience": "MyAudience",
"Key": "MySecretKey"
}
}
在上面的代码中,我们配置了JWT的Issuer、Audience和Key。
- 添加JWT授权验证:
我们可以在Startup类中添加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 = Configuration["Jwt:Issuer"],
ValidAudience = Configuration["Jwt:Audience"],
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:Key"]))
};
});
services.AddControllers();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseAuthentication();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
在上面的代码中,我们使用AddAuthentication方法来添加JWT授权验证,并使用AddJwtBearer方法来配置JWT授权验证的选项。
- 生成JWT:
我们可以创建一个名为"JwtController"的Controller,并添加以下代码:
[Route("api/[controller]")]
[ApiController]
public class JwtController : ControllerBase
{
private readonly IConfiguration _configuration;
public JwtController(IConfiguration configuration)
{
_configuration = configuration;
}
[HttpPost]
public IActionResult Post([FromBody] User user)
{
if (user == null)
{
return BadRequest("Invalid client request");
}
if (user.Username == "admin" && user.Password == "admin")
{
var tokenString = GenerateJwtToken(user);
return Ok(new { Token = tokenString });
}
return Unauthorized();
}
private string GenerateJwtToken(User user)
{
var tokenHandler = new JwtSecurityTokenHandler();
var key = Encoding.ASCII.GetBytes(_configuration["Jwt:Key"]);
var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(new Claim[]
{
new Claim(ClaimTypes.Name, user.Username),
new Claim(ClaimTypes.Role, "Admin")
}),
Expires = DateTime.UtcNow.AddDays(7),
SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
};
var token = tokenHandler.CreateToken(tokenDescriptor);
return tokenHandler.WriteToken(token);
}
}
在上面的代码中,我们创建了一个名为JwtController的Controller,并在Post方法中生成JWT。
- 验证JWT:
我们可以创建一个名为"ValuesController"的Controller,并添加以下代码:
[Authorize]
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
[HttpGet]
public IActionResult Get()
{
var identity = HttpContext.User.Identity as ClaimsIdentity;
var username = identity.FindFirst(ClaimTypes.Name)?.Value;
var role = identity.FindFirst(ClaimTypes.Role)?.Value;
return Ok(new { Username = username, Role = role });
}
}
在上面的代码中,我们创建了一个名为ValuesController的Controller,并使用Authorize特性来标记需要验证JWT的API。
示例2:使用自定义Claim验证JWT
在本示例中,我们将演示如何使用自定义Claim来验证JWT。我们可以按照以下步骤来实现:
- 创建ASP.NET Core Web API项目:
我们可以使用Visual Studio创建一个名为"JwtCustomClaimExample"的ASP.NET Core Web API项目。
- 安装Microsoft.AspNetCore.Authentication.JwtBearer:
我们可以使用NuGet包管理器来安装Microsoft.AspNetCore.Authentication.JwtBearer。可以使用以下命令来安装Microsoft.AspNetCore.Authentication.JwtBearer:
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
- 配置JWT:
我们可以在appsettings.json文件中配置JWT。可以使用以下代码来配置JWT:
{
"Jwt": {
"Issuer": "MyIssuer",
"Audience": "MyAudience",
"Key": "MySecretKey"
}
}
在上面的代码中,我们配置了JWT的Issuer、Audience和Key。
- 添加JWT授权验证:
我们可以在Startup类中添加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 = Configuration["Jwt:Issuer"],
ValidAudience = Configuration["Jwt:Audience"],
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:Key"])),
RoleClaimType = "Role"
};
});
services.AddControllers();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseAuthentication();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
在上面的代码中,我们使用AddAuthentication方法来添加JWT授权验证,并使用AddJwtBearer方法来配置JWT授权验证的选项,并使用RoleClaimType属性来指定自定义Claim的名称。
- 生成JWT:
我们可以创建一个名为"JwtController"的Controller,并添加以下代码:
[Route("api/[controller]")]
[ApiController]
public class JwtController : ControllerBase
{
private readonly IConfiguration _configuration;
public JwtController(IConfiguration configuration)
{
_configuration = configuration;
}
[HttpPost]
public IActionResult Post([FromBody] User user)
{
if (user == null)
{
return BadRequest("Invalid client request");
}
if (user.Username == "admin" && user.Password == "admin")
{
var tokenString = GenerateJwtToken(user);
return Ok(new { Token = tokenString });
}
return Unauthorized();
}
private string GenerateJwtToken(User user)
{
var tokenHandler = new JwtSecurityTokenHandler();
var key = Encoding.ASCII.GetBytes(_configuration["Jwt:Key"]);
var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(new Claim[]
{
new Claim(ClaimTypes.Name, user.Username),
new Claim("Role", "Admin")
}),
Expires = DateTime.UtcNow.AddDays(7),
SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
};
var token = tokenHandler.CreateToken(tokenDescriptor);
return tokenHandler.WriteToken(token);
}
}
在上面的代码中,我们创建了一个名为JwtController的Controller,并在Post方法中生成JWT,并使用自定义Claim来指定用户的角色。
- 验证JWT:
我们可以创建一个名为"ValuesController"的Controller,并添加以下代码:
[Authorize(Roles = "Admin")]
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
[HttpGet]
public IActionResult Get()
{
var identity = HttpContext.User.Identity as ClaimsIdentity;
var username = identity.FindFirst(ClaimTypes.Name)?.Value;
var role = identity.FindFirst("Role")?.Value;
return Ok(new { Username = username, Role = role });
}
}
在上面的代码中,我们创建了一个名为ValuesController的Controller,并使用Authorize特性来标记需要验证JWT的API,并使用Roles属性来指定需要验证的角色,使用自定义Claim来获取用户的角色。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:.Net Core官方JWT授权验证的全过程 - Python技术站