ASP.NET Core实战:Token基础身份验证实现步骤

2 下载量 45 浏览量 更新于2024-08-31 收藏 81KB PDF 举报
"在ASP.NET Core中实现实例化一个基于Token的身份认证" 在传统的Web应用程序中,身份验证通常依赖于Cookie和Session来维护用户的登录状态。然而,随着Web API和多终端应用的兴起,这种方法变得不再适用,因为非浏览器客户端无法处理Cookie。基于Token的身份验证应运而生,它具有更好的开放性和安全性,适用于各种不同的客户端。 在ASP.NET Core中,我们可以使用内置的API来实现基于Token的身份验证,特别是JSON Web Tokens (JWT)。JWT是一种轻量级的身份验证和授权机制,可以在客户端和服务器之间安全地传递信息。本文将详细介绍如何使用Microsoft的JwtSecurityTokenHandler来创建基于Bearer token的认证系统。 首先,我们需要进行一些准备工作。确保使用Visual Studio 2015 Update 3作为开发环境,并安装.NET Core的运行时和开发工具。然后,创建一个新的ASP.NET Core Web Application (.NET Core)项目,命名为"CSTokenBaseAuth"。 在项目中,我们需要创建几个辅助类。在项目根目录下创建一个名为"Auth"的文件夹,并在其中添加两个文件:RSAKeyHelper.cs和TokenAuthOption.cs。在RSAKeyHelper.cs中,我们将生成RSA密钥对,这是用于签名和验证JWT的关键步骤: ```csharp using System.Security.Cryptography; namespace CSTokenBaseAuth.Auth { public class RSAKeyHelper { public static RSAParameters GenerateKey() { using (var key = new RSACryptoServiceProvider(2048)) { return key.ExportParameters(true); } } } } ``` TokenAuthOption.cs文件将包含身份验证相关的配置,例如令牌的有效期、签发者(Issuer)和受众(Audience)等: ```csharp public class TokenAuthOption { public string Issuer { get; set; } public string Audience { get; set; } public int ExpiryInMinutes { get; set; } public RSAParameters RSAParameters { get; set; } } ``` 接着,我们需要在Startup.cs中配置JWT身份验证服务。在ConfigureServices方法中,添加以下代码: ```csharp services.AddAuthentication(options => { options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; }) .AddJwtBearer(options => { var tokenOptions = Configuration.GetSection("TokenAuth").Get<TokenAuthOption>(); options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, ValidIssuer = tokenOptions.Issuer, ValidAudience = tokenOptions.Audience, IssuerSigningKey = new RsaSecurityKey(tokenOptions.RSAParameters) }; }); ``` 同时,在Configure方法中,启用中间件以处理身份验证: ```csharp app.UseAuthentication(); ``` 为了生成和验证JWT,我们还需要创建一个TokenController,其中包含生成令牌和验证令牌的API。例如,GenerateToken方法用于生成JWT,而ValidateToken方法用于验证令牌: ```csharp [Route("api/[controller]")] [ApiController] public class TokenController : ControllerBase { private readonly TokenAuthOption _tokenOptions; public TokenController(IOptions<TokenAuthOption> tokenOptions) { _tokenOptions = tokenOptions.Value; } [HttpPost("generate")] public IActionResult GenerateToken([FromBody] User user) { // 验证用户,然后... var claims = new[] { new Claim(JwtRegisteredClaimNames.Sub, user.Username) }; var signingKey = new RsaSecurityKey(_tokenOptions.RSAParameters); var signingCredentials = new SigningCredentials(signingKey, SecurityAlgorithms.RsaSha256); var jwt = new JwtSecurityToken( issuer: _tokenOptions.Issuer, audience: _tokenOptions.Audience, claims: claims, expires: DateTime.UtcNow.AddMinutes(_tokenOptions.ExpiryInMinutes), signingCredentials: signingCredentials ); var tokenString = new JwtSecurityTokenHandler().WriteToken(jwt); return Ok(new { token = tokenString }); } [HttpGet("validate")] public IActionResult ValidateToken() { var token = HttpContext.Request.Headers["Authorization"].FirstOrDefault()?.Split(" ").Last(); if (string.IsNullOrEmpty(token)) { return Unauthorized(); } try { var handler = new JwtSecurityTokenHandler(); var principal = handler.ValidateToken(token, new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, ValidIssuer = _tokenOptions.Issuer, ValidAudience = _tokenOptions.Audience, IssuerSigningKey = new RsaSecurityKey(_tokenOptions.RSAParameters) }, out var rawValidatedToken); return Ok(principal.Identity.IsAuthenticated); } catch { return Unauthorized(); } } } ``` 这个例子展示了如何在ASP.NET Core中创建一个基于Bearer token的身份验证系统。读者可以通过按照这个步骤操作,下载并分析代码结构,来深入理解这个过程。通过这种方式,你可以为你的Web API提供安全的身份验证机制,支持多种客户端的访问。