ASP.NET Core 中的身份验证和授权(针对 .NET 8/9 更新)

科技   2024-11-20 17:01   上海  


身份验证和授权对于保护现代 Web 应用程序至关重要。它们确保用户是他们声称的身份 (身份验证) 并且他们具有正确的访问级别 (授权)。ASP.NET Core 提供内置工具来简化此过程,同时提供实施复杂安全措施的灵活性。

身份验证和授权之间的区别

  • 身份验证验证用户的身份。例如,当用户登录仓库管理系统时,将使用用户名和密码等凭证或使用令牌进行基于 API 的访问来验证其身份。

  • 授权控制经过身份验证的用户在应用程序中可以执行的操作。例如,经过身份验证的仓库经理可能有权访问库存控制功能,而普通员工只能查看库存水平。

这些流程相互关联,形成一个安全层,确保只有正确的用户才能访问正确的资源。

在 ASP.NET Core 中配置身份验证

ASP.NET Core 提供了多种身份验证选项,包括基于 Cookie 的身份验证、JWT (JSON Web 令牌)、OAuth2OpenID Connect 以及与 Google 和 Azure Active Directory 等外部提供商的集成。让我们探索这些方法的设置和配置,特别注意 ASP.NET Core 8 中的更新。

1. 基于 Cookie 的身份验证

此方法非常适合会话管理至关重要的传统 Web 应用程序。它将身份验证数据存储在用户浏览器上的 Cookie 中。

设置示例:

public void ConfigureServices(IServiceCollection services)  
{
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(options =>
{
options.LoginPath = "/User/Login";
options.LogoutPath = "/User/Logout";
options.ExpireTimeSpan = TimeSpan.FromHours(1);
options.SlidingExpiration = true; // Extends session expiration on active use
});

services.AddAuthorization();
}

在此设置中,我们用于通过每次用户交互来延长 Cookie 的生命周期。这对于仓库管理系统等应用程序非常有用,因为用户在轮班期间可能会长时间保持活动状态。SlidingExpiration

ASP.NET Core 8 的更新信息

在 ASP.NET Core 8 中,指定默认身份验证方案变得不那么重要,因为会自动采用第一个配置的方案。虽然这可以简化设置,但最好还是明确定义方案以提高可读性并避免混淆。

services.AddAuthentication(options =>  
{
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
});

2. API 的 JWT 身份验证

JWT 是 RESTful API 的理想选择,它提供了一种无状态的方式来验证用户。当不同的客户端应用程序(如移动应用程序或 IoT 设备)与同一后端服务交互时,这尤其有用。

真实世界的例子:

考虑一个自动化仓库系统,其中移动扫描仪与 API 交互以更新库存水平。JWT 可用于保护 API 端点,确保只有授权设备和用户才能访问数据。

设置示例:

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.AddAuthorization();
}

在上述设置中,确保令牌由受信任的源颁发且有效。此配置对于保护与库存管理系统交互的 API 终端节点至关重要,并且必须验证由集中式身份验证服务器颁发的令牌。TokenValidationParameters

3. OAuth2 和 OpenID Connect

与 Azure ADGoogle 或 Auth0 等外部身份提供商集成时,OAuth2 和 OpenID Connect 是首选标准。它们支持**单点登录 (SSO),**允许用户登录一次并安全地访问多项服务。

真实世界的例子:

想象一下一家物流公司,员工使用中央身份验证系统(如 Azure AD)来访问多个应用程序,例如库存系统、调度管理和报告工具。此设置简化了用户管理,同时通过集中控制增强了安全性。

设置示例:

public void ConfigureServices(IServiceCollection services)  
{
services.AddAuthentication(options =>
{
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie()
.AddOpenIdConnect(options =>
{
options.Authority = "https://login.microsoftonline.com/{tenantId}";
options.ClientId = Configuration["AzureAd:ClientId"];
options.ClientSecret = Configuration["AzureAd:ClientSecret"];
options.ResponseType = "code";
options.UsePkce = true; // PKCE for enhanced security
options.SaveTokens = true;
});

services.AddAuthorization();
}

密钥更新:将 PKCE 与授权码流程结合使用

PKCE(代码交换证明密钥)在 ASP.NET Core 8 中默认启用,通过防止令牌拦截攻击,使授权代码流更加安全。此更新对于需要高安全性的应用程序至关重要,例如管理敏感财务或运营数据的企业资源规划 (ERP) 系统

在 ASP.NET Core 中实施授权

ASP.NET Core 中的授权用途广泛,允许基于角色声明策略进行控制。

1. 基于角色的授权

角色通常用于简单的访问控制方案,其中用户被分类为组,如 、 或 。AdminManagerEmployee

示例场景:

在 Automated Warehouse 系统中,角色可能有权访问所有配置选项,而 则只能访问库存报表和库存调整。AdminManager

使用示例:

[Authorize(Roles = "Admin")]  
public IActionResult ConfigureSystem()
{
return View();
}

此方法可确保只有具有该角色的用户才能访问该操作。AdminConfigureSystem

2. 基于策略的授权

对于更复杂的授权要求,基于策略的授权是理想的选择。它允许通过利用声明对访问进行精细控制。

示例场景:

物流公司可能要求只有经过验证的用户才能批准新的配送路线。这可以使用自定义策略进行管理。DepartmentHead

设置示例:

public void ConfigureServices(IServiceCollection services)  
{
services.AddAuthorization(options =>
{
options.AddPolicy("DepartmentHeadPolicy", policy =>
policy.RequireClaim("Position", "DepartmentHead"));
});
}

使用示例:

[Authorize(Policy = "DepartmentHeadPolicy")]  
public IActionResult ApproveRoutes()
{
return View();
}

3. 基于声明的授权

基于声明的授权使用自定义属性(如 、 或其他特定于域的数据)提供精细控制。DepartmentClearanceLevel

示例场景:

银行应用程序中,只有 为 的用户才能访问敏感的财务报告。ClearanceLevelHigh

[Authorize]  
public IActionResult FinancialReport()
{
var clearanceLevel = User.FindFirst("ClearanceLevel")?.Value;
if (clearanceLevel == "High")
{
// Allow access to the report
}
else
{
return Forbid();
}

return View();
}

最佳实践和常见挑战

令牌管理和安全性

使用 JWT 时,令牌过期刷新令牌对于维护安全会话而不会给用户带来过重负担至关重要。实施刷新令牌可确保用户无需频繁登录,从而增强用户在高流量应用程序(如电子商务平台)中的用户体验。

安全存储密钥

始终使用 Azure Key Vault 或 AWS Secrets Manager 等解决方案安全地存储敏感数据,如 ClientSecrets 和 JWT 签名密钥。避免直接在源代码或配置文件中对它们进行硬编码,以防止泄漏。

确保 HTTPS

将 ASP.NET Core 应用程序配置为强制实施 HTTPS 以保护通信通道,从而保护令牌和敏感数据不被拦截。

app.UseHttpsRedirection();

身份验证和授权是保护 ASP.NET Core 中的 Web 应用程序不可或缺的一部分。借助 ASP.NET Core 8 中的新功能(例如默认 PKCE 和改进的方案处理),开发人员可以构建更安全、更简化的应用程序。

  • 将 JWT 用于 API,尤其是当客户端包含移动设备或 IoT 系统时。

  • 使用 OAuth2 实施 PKCE 以实现安全的授权代码流。

  • 使用基于策略的授权进行复杂的、声明驱动的访问控制。

  • 优先考虑密钥的安全存储并强制实施 HTTPS 以保护敏感数据。


  • 如果你喜欢我的文章,请给我一个赞!谢谢

架构师老卢
资深软件架构师, 分享编程、软件设计经验, 教授前沿技术, 分享技术资源(每天发布电子书),每天进步一点点...
 最新文章