ASP.NET Core JWT 认证与授权

举报
鱼弦 发表于 2025/03/08 22:36:05 2025/03/08
【摘要】 ASP.NET Core JWT 认证与授权 1. 介绍JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在网络应用环境间安全地传递声明。ASP.NET Core 提供了内置的 JWT 认证与授权机制,可以轻松实现用户身份验证和权限控制。 2. 应用使用场景用户认证:验证用户身份,确保只有合法用户可以访问系统。API 保护:保护 RESTful API,防止未授...

ASP.NET Core JWT 认证与授权

1. 介绍

JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在网络应用环境间安全地传递声明。ASP.NET Core 提供了内置的 JWT 认证与授权机制,可以轻松实现用户身份验证和权限控制。


2. 应用使用场景

  • 用户认证:验证用户身份,确保只有合法用户可以访问系统。
  • API 保护:保护 RESTful API,防止未授权访问。
  • 单点登录(SSO):在多个应用间共享用户认证状态。
  • 权限控制:根据用户角色限制访问权限。

3. 不同场景下详细代码实现

场景一:用户认证

  1. 安装 NuGet 包

    dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
    
  2. 配置 JWT 认证

    // Startup.cs
    public void ConfigureServices(IServiceCollection services)
    {
        var key = Encoding.ASCII.GetBytes("YourSecretKey");
        services.AddAuthentication(x =>
        {
            x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
        })
        .AddJwtBearer(x =>
        {
            x.RequireHttpsMetadata = false;
            x.SaveToken = true;
            x.TokenValidationParameters = new TokenValidationParameters
            {
                ValidateIssuerSigningKey = true,
                IssuerSigningKey = new SymmetricSecurityKey(key),
                ValidateIssuer = false,
                ValidateAudience = false
            };
        });
    
        services.AddControllers();
    }
    
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        app.UseAuthentication();
        app.UseAuthorization();
    
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
        });
    }
    
  3. 生成 JWT Token

    // AuthController.cs
    [ApiController]
    [Route("api/[controller]")]
    public class AuthController : ControllerBase
    {
        private readonly IConfiguration _configuration;
    
        public AuthController(IConfiguration configuration)
        {
            _configuration = configuration;
        }
    
        [HttpPost("login")]
        public IActionResult Login([FromBody] UserLogin userLogin)
        {
            var user = Authenticate(userLogin);
    
            if (user != null)
            {
                var token = GenerateJwtToken(user);
                return Ok(new { token });
            }
    
            return NotFound("User not found");
        }
    
        private UserModel Authenticate(UserLogin userLogin)
        {
            // 验证用户逻辑
            return new UserModel { Username = userLogin.Username };
        }
    
        private string GenerateJwtToken(UserModel user)
        {
            var key = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(_configuration["Jwt:Key"]));
            var credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
    
            var token = new JwtSecurityToken(
                issuer: _configuration["Jwt:Issuer"],
                audience: _configuration["Jwt:Audience"],
                claims: new[] { new Claim(ClaimTypes.Name, user.Username) },
                expires: DateTime.Now.AddMinutes(30),
                signingCredentials: credentials);
    
            return new JwtSecurityTokenHandler().WriteToken(token);
        }
    }
    

场景二:API 保护

  1. 保护 API
    // WeatherForecastController.cs
    [ApiController]
    [Route("api/[controller]")]
    [Authorize]
    public class WeatherForecastController : ControllerBase
    {
        private static readonly string[] Summaries = new[]
        {
            "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
        };
    
        [HttpGet]
        public IEnumerable<WeatherForecast> Get()
        {
            var rng = new Random();
            return Enumerable.Range(1, 5).Select(index => new WeatherForecast
            {
                Date = DateTime.Now.AddDays(index),
                TemperatureC = rng.Next(-20, 55),
                Summary = Summaries[rng.Next(Summaries.Length)]
            })
            .ToArray();
        }
    }
    

场景三:权限控制

  1. 定义角色

    // Startup.cs
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddAuthorization(options =>
        {
            options.AddPolicy("AdminOnly", policy => policy.RequireRole("Admin"));
        });
    
        services.AddControllers();
    }
    
  2. 应用角色策略

    // AdminController.cs
    [ApiController]
    [Route("api/[controller]")]
    [Authorize(Policy = "AdminOnly")]
    public class AdminController : ControllerBase
    {
        [HttpGet]
        public IActionResult Get()
        {
            return Ok("This is an admin-only endpoint");
        }
    }
    

4. 原理解释

JWT 是一种基于 JSON 的开放标准,用于在网络应用环境间安全地传递声明。JWT 由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。通过签名,可以验证 JWT 的真实性和完整性。


5. 算法原理流程图

用户登录 -> 生成 JWT -> 客户端存储 JWT -> 请求 API -> 验证 JWT -> 返回响应

6. 算法原理解释

  • 用户登录:用户提供凭证,服务器验证凭证。
  • 生成 JWT:服务器生成 JWT 并返回给客户端。
  • 客户端存储 JWT:客户端存储 JWT,通常在本地存储或 Cookie 中。
  • 请求 API:客户端在请求头中包含 JWT。
  • 验证 JWT:服务器验证 JWT 的真实性和完整性。
  • 返回响应:服务器根据 JWT 中的声明返回响应。

7. 实际详细应用代码示例实现

用户认证

// AuthController.cs
[ApiController]
[Route("api/[controller]")]
public class AuthController : ControllerBase
{
    private readonly IConfiguration _configuration;

    public AuthController(IConfiguration configuration)
    {
        _configuration = configuration;
    }

    [HttpPost("login")]
    public IActionResult Login([FromBody] UserLogin userLogin)
    {
        var user = Authenticate(userLogin);

        if (user != null)
        {
            var token = GenerateJwtToken(user);
            return Ok(new { token });
        }

        return NotFound("User not found");
    }

    private UserModel Authenticate(UserLogin userLogin)
    {
        // 验证用户逻辑
        return new UserModel { Username = userLogin.Username };
    }

    private string GenerateJwtToken(UserModel user)
    {
        var key = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(_configuration["Jwt:Key"]));
        var credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

        var token = new JwtSecurityToken(
            issuer: _configuration["Jwt:Issuer"],
            audience: _configuration["Jwt:Audience"],
            claims: new[] { new Claim(ClaimTypes.Name, user.Username) },
            expires: DateTime.Now.AddMinutes(30),
            signingCredentials: credentials);

        return new JwtSecurityTokenHandler().WriteToken(token);
    }
}

API 保护

// WeatherForecastController.cs
[ApiController]
[Route("api/[controller]")]
[Authorize]
public class WeatherForecastController : ControllerBase
{
    private static readonly string[] Summaries = new[]
    {
        "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
    };

    [HttpGet]
    public IEnumerable<WeatherForecast> Get()
    {
        var rng = new Random();
        return Enumerable.Range(1, 5).Select(index => new WeatherForecast
        {
            Date = DateTime.Now.AddDays(index),
            TemperatureC = rng.Next(-20, 55),
            Summary = Summaries[rng.Next(Summaries.Length)]
        })
        .ToArray();
    }
}

8. 测试步骤以及详细代码

  1. 安装 NuGet 包

    dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
    
  2. 配置 JWT 认证

    • Startup.cs 中配置 JWT 认证。
  3. 生成 JWT Token

    • 实现登录接口,生成 JWT Token。
  4. 保护 API

    • 使用 [Authorize] 属性保护 API。
  5. 测试功能

    • 使用 Postman 或 Swagger 测试认证和授权功能。

9. 部署场景

  • 硬件:云服务器(如 AWS、Azure)。
  • 软件:.NET Core SDK、Nginx、Docker。
  • 网络:HTTPS 加密传输,确保数据安全。

10. 材料链接


11. 总结

ASP.NET Core 提供了强大的 JWT 认证与授权机制,可以轻松实现用户身份验证和权限控制。通过合理的配置和实现,可以构建安全可靠的 Web 应用。


12. 未来展望

  • 多因素认证:结合短信或邮件验证码增强安全性。
  • OAuth 2.0 集成:支持第三方登录(如 Google、Facebook)。
  • 分布式认证:结合 IdentityServer 实现分布式认证。
  • AI 驱动的安全防护:利用 AI 技术检测异常登录行为。

通过不断的技术创新和应用实践,ASP.NET Core 在认证与授权领域的应用前景将更加广阔。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。