ASP.NET Core Identity 实现JWT认证

在本文中,将探讨如何在ASP.NET Core Identity中实现JWT(JSON Web Token)认证。JWT认证是一种基于令牌的认证机制,它允许应用程序在不依赖于会话和cookie的情况下进行安全的用户认证。这种机制特别适用于需要从移动应用或其他客户端安全地调用API的场景。

项目设置和身份数据库

首先,需要设置一个ASP.NET Core MVC项目,并配置身份数据库。将使用ASP.NET Core Identity来实现用户注册、登录和登出功能。

用户注册、登录和登出功能

在ASP.NET Core MVC项目中,可以使用ASP.NET Core Identity来实现用户注册、登录和登出功能。这些功能将使用基于cookie的认证,这对于Web应用来说是一个很好的选择。

支持JWTToken的认证

对于需要从移动应用或其他客户端安全地调用API的场景,基于cookie的认证可能不是最佳选择。在这种情况下,可以使用基于令牌的认证,特别是JWTToken。

为了在项目中添加JWTToken生成能力,需要在Startup类中的ConfigureServices方法中配置身份中间件的服务。

public void ConfigureServices(IServiceCollection services) { services.AddDbContext(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); services.AddIdentity() .AddEntityFrameworkStores() .AddDefaultTokenProviders(); services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddCookie() .AddJwtBearer(jwtBearerOptions => { jwtBearerOptions.TokenValidationParameters = new TokenValidationParameters() { ValidateActor = false, ValidateAudience = false, ValidateLifetime = true, ValidateIssuerSigningKey = true, ValidIssuer = Configuration["Token:Issuer"], ValidAudience = Configuration["Token:Audience"], IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Token:Key"])) }; }); services.AddMvc(); }

准备控制器

接下来,将添加两个新的Web API控制器:

  • TokenController - 匿名可访问,用于用户获取JWT Token。
  • GreetingController - 安全的,并且只能使用JWT Token认证方案访问。

TokenController中的令牌生成代码如下:

[HttpPost] public async Task Get(LoginViewModel model) { if (ModelState.IsValid) { var user = await _userManager.FindByEmailAsync(model.Email); if (user != null) { var result = await _signInManager.CheckPasswordSignInAsync(user, model.Password, lockoutOnFailure: false); if (!result.Succeeded) { return Unauthorized(); } var claims = new[] { new Claim(JwtRegisteredClaimNames.Sub, model.Email), new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()) }; var token = new JwtSecurityToken ( issuer: _configuration["Token:Issuer"], audience: _configuration["Token:Audience"], claims: claims, expires: DateTime.UtcNow.AddDays(60), notBefore: DateTime.UtcNow, signingCredentials: new SigningCredentials(new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Token:Key"])), SecurityAlgorithms.HmacSha256) ); return Ok(new { token = new JwtSecurityTokenHandler().WriteToken(token) }); } } return BadRequest(); }

为了测试实现,将使用Postman。首先,将尝试从Postman访问Greeting API(http://localhost:36946/api/greeting)。将看到得到了未授权错误。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485