当使用ASP.NET Core构建Web应用程序时,使用JWT(JSON Web Token)进行身份验证和授权是一种常见的方法。JWT是一种轻量级的身份验证和授权机制,它使用JSON格式的令牌来传递用户信息和权限。
以下是使用ASP.NET Core进行JWT身份验证和授权的完整攻略:
步骤一:安装必要的NuGet包
在使用JWT进行身份验证和授权之前,需要安装以下NuGet包:
- Microsoft.AspNetCore.Authentication.JwtBearer:用于JWT身份验证。
- Microsoft.IdentityModel.Tokens:用于JWT令牌生成和验证。
可以使用以下命令在Visual Studio中安装这些NuGet包:
Install-Package Microsoft.AspNetCore.Authentication.JwtBearer
Install-Package Microsoft.IdentityModel.Tokens
步骤二:配置JWT身份验证
在ASP.NET Core应用程序的Startup.cs文件中,需要配置JWT身份验证。以下是一个示例:
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.IdentityModel.Tokens;
using System.Text;
public void ConfigureServices(IServiceCollection services)
{
// 配置JWT身份验证
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = "your-issuer",
ValidAudience = "your-audience",
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("your-secret-key"))
};
});
}
在上面的示例中,我们使用AddAuthentication方法配置JWT身份验证,并使用AddJwtBearer方法指定JWT身份验证的默认方案。然后,我们使用TokenValidationParameters属性配置JWT令牌的验证参数,包括颁发者、受众、过期时间、签名密钥等。
步骤三:生成JWT令牌
在ASP.NET Core应用程序中,可以使用以下代码生成JWT令牌:
using Microsoft.IdentityModel.Tokens;
using System;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
public string GenerateJwtToken(string secretKey, string issuer, string audience, int expireMinutes, IEnumerable<Claim> claims)
{
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secretKey));
var credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var token = new JwtSecurityToken(
issuer: issuer,
audience: audience,
claims: claims,
expires: DateTime.Now.AddMinutes(expireMinutes),
signingCredentials: credentials);
return new JwtSecurityTokenHandler().WriteToken(token);
}
在上面的示例中,我们使用JwtSecurityToken类创建JWT令牌,并使用SigningCredentials属性指定签名密钥和算法。然后,我们可以使用WriteToken方法将JWT令牌转换为字符串。
步骤四:使用JWT令牌进行身份验证和授权
在ASP.NET Core应用程序中,可以使用以下代码使用JWT令牌进行身份验证和授权:
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
public class MyController : Controller
{
// ...
}
在上面的示例中,我们使用Authorize属性指定JWT身份验证的方案,并将其应用于控制器类。这将确保只有经过身份验证的用户才能访问该控制器。
示例一:生成JWT令牌并使用它进行身份验证和授权
以下是一个示例,演示如何生成JWT令牌并使用它进行身份验证和授权:
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.IdentityModel.Tokens;
using System;
using System.Collections.Generic;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
[ApiController]
[Route("[controller]")]
public class AuthController : ControllerBase
{
[HttpPost("login")]
public IActionResult Login()
{
// 假设这里是用户登录验证,验证通过后生成JWT令牌
var claims = new List<Claim>
{
new Claim(ClaimTypes.Name, "user-name"),
new Claim(ClaimTypes.Role, "user-role")
};
var token = GenerateJwtToken("your-secret-key", "your-issuer", "your-audience", 30, claims);
return Ok(new { token });
}
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
[HttpGet("protected")]
public IActionResult Protected()
{
// 只有经过身份验证的用户才能访问该方法
var userName = User.Identity.Name;
var userRole = User.FindFirst(ClaimTypes.Role)?.Value;
return Ok(new { userName, userRole });
}
private string GenerateJwtToken(string secretKey, string issuer, string audience, int expireMinutes, IEnumerable<Claim> claims)
{
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secretKey));
var credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var token = new JwtSecurityToken(
issuer: issuer,
audience: audience,
claims: claims,
expires: DateTime.Now.AddMinutes(expireMinutes),
signingCredentials: credentials);
return new JwtSecurityTokenHandler().WriteToken(token);
}
}
在上面的示例中,我们创建了一个名为AuthController的控制器,并在其中定义了两个方法:Login和Protected。在Login方法中,我们假设进行了用户登录验证,并生成了JWT令牌。在Protected方法中,我们使用Authorize属性指定JWT身份验证的方案,并将其应用于该方法。只有经过身份验证的用户才能访问该方法。在该方法中,我们可以使用User.Identity和User.FindFirst方法获取用户信息和权限。
示例二:使用ASP.NET Core Identity进行JWT身份验证和授权
如果您正在使用ASP.NET Core Identity进行身份验证和授权,可以使用以下代码配置JWT身份验证:
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.IdentityModel.Tokens;
using System.Text;
public void ConfigureServices(IServiceCollection services)
{
// 配置ASP.NET Core Identity
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
// 配置JWT身份验证
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = "your-issuer",
ValidAudience = "your-audience",
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("your-secret-key"))
};
});
}
在上面的示例中,我们使用AddIdentity方法配置ASP.NET Core Identity,并使用AddJwtBearer方法配置JWT身份验证。然后,我们可以在控制器中使用Authorize属性指定JWT身份验证的方案,并使用UserManager和SignInManager类进行身份验证和授权。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:ASP.NET Core使用JWT认证授权的方法 - Python技术站