身份验证和授权对于保护现代 Web 应用程序至关重要。它们确保用户是他们声称的身份 (身份验证) 并且他们具有正确的访问级别 (授权)。ASP.NET Core 提供内置工具来简化此过程,同时提供实施复杂安全措施的灵活性。
这些流程相互关联,形成一个安全层,确保只有正确的用户才能访问正确的资源。
ASP.NET Core 提供了多种身份验证选项,包括基于 Cookie 的身份验证、JWT (JSON Web 令牌)、OAuth2、OpenID Connect 以及与 Google 和 Azure Active Directory 等外部提供商的集成。让我们探索这些方法的设置和配置,特别注意 ASP.NET Core 8 中的更新。
此方法非常适合会话管理至关重要的传统 Web 应用程序。它将身份验证数据存储在用户浏览器上的 Cookie 中。
设置示例:
publicvoidConfigureServices(IServiceCollection services)
{
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(options=>
{
options.LoginPath="/User/Login";
options.LogoutPath="/User/Logout";
options.ExpireTimeSpan= TimeSpan.FromHours();
options.SlidingExpiration=true;// Extends session expiration on active use
});
services.AddAuthorization();
}
在此设置中,我们用于通过每次用户交互来延长 Cookie 的生命周期。这对于仓库管理系统等应用程序非常有用,因为用户在轮班期间可能会长时间保持活动状态。SlidingExpiration
在 ASP.NET Core 8 中,指定默认身份验证方案变得不那么重要,因为会自动采用第一个配置的方案。虽然这可以简化设置,但最好还是明确定义方案以提高可读性并避免混淆。
services.AddAuthentication(options=>
{
options.DefaultScheme= CookieAuthenticationDefaults.AuthenticationScheme;
});
JWT 是 RESTful API 的理想选择,它提供了一种无状态的方式来验证用户。当不同的客户端应用程序(如移动应用程序或 IoT 设备)与同一后端服务交互时,这尤其有用。
真实世界的例子:
考虑一个自动化仓库系统,其中移动扫描仪与 API 交互以更新库存水平。JWT 可用于保护 API 端点,确保只有授权设备和用户才能访问数据。
设置示例:
publicvoidConfigureServices(IServiceCollection services)
{
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options=>
{
options.TokenValidationParameters=newTokenValidationParameters
{
ValidateIssuer=true,
ValidateAudience=true,
ValidateLifetime=true,
ValidateIssuerSigningKey=true,
ValidIssuer= Configuration["Jwt:Issuer"],
ValidAudience= Configuration["Jwt:Audience"],
IssuerSigningKey=newSymmetricSecurityKey(
Encoding.UTF8.GetBytes(Configuration["Jwt:Key"]))
};
});
services.AddAuthorization();
}
在上述设置中,确保令牌由受信任的源颁发且有效。此配置对于保护与库存管理系统交互的 API 终端节点至关重要,并且必须验证由集中式身份验证服务器颁发的令牌。TokenValidationParameters
与 Azure AD、Google 或 Auth0 等外部身份提供商集成时,OAuth2 和 OpenID Connect 是首选标准。它们支持**单点登录 (SSO),**允许用户登录一次并安全地访问多项服务。
真实世界的例子:
想象一下一家物流公司,员工使用中央身份验证系统(如 Azure AD)来访问多个应用程序,例如库存系统、调度管理和报告工具。此设置简化了用户管理,同时通过集中控制增强了安全性。
设置示例:
publicvoidConfigureServices(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(代码交换证明密钥)在 ASP.NET Core 8 中默认启用,通过防止令牌拦截攻击,使授权代码流更加安全。此更新对于需要高安全性的应用程序至关重要,例如管理敏感财务或运营数据的企业资源规划 (ERP) 系统。
ASP.NET Core 中的授权用途广泛,允许基于角色、声明和策略进行控制。
角色通常用于简单的访问控制方案,其中用户被分类为组,如 、 或 。AdminManagerEmployee
示例场景:
在 Automated Warehouse 系统中,角色可能有权访问所有配置选项,而 则只能访问库存报表和库存调整。AdminManager
使用示例:
[Authorize(Roles="Admin")]
publicIActionResultConfigureSystem()
{
returnView();
}
此方法可确保只有具有该角色的用户才能访问该操作。AdminConfigureSystem
对于更复杂的授权要求,基于策略的授权是理想的选择。它允许通过利用声明对访问进行精细控制。
示例场景:
物流公司可能要求只有经过验证的用户才能批准新的配送路线。这可以使用自定义策略进行管理。DepartmentHead
设置示例:
publicvoidConfigureServices(IServiceCollection services)
{
services.AddAuthorization(options=>
{
options.AddPolicy("DepartmentHeadPolicy", policy=>
policy.RequireClaim("Position","DepartmentHead"));
});
}
使用示例:
[Authorize(Policy="DepartmentHeadPolicy")]
publicIActionResultApproveRoutes()
{
returnView();
}
基于声明的授权使用自定义属性(如 、 或其他特定于域的数据)提供精细控制。DepartmentClearanceLevel
示例场景:
在银行应用程序中,只有 为 的用户才能访问敏感的财务报告。ClearanceLevelHigh
[Authorize]
publicIActionResultFinancialReport()
{
var clearanceLevel= User.FindFirst("ClearanceLevel")?.Value;
if(clearanceLevel=="High")
{
// Allow access to the report
}
else
{
returnForbid();
}
returnView();
}
使用 JWT 时,令牌过期和刷新令牌对于维护安全会话而不会给用户带来过重负担至关重要。实施刷新令牌可确保用户无需频繁登录,从而增强用户在高流量应用程序(如电子商务平台)中的用户体验。
始终使用 Azure Key Vault 或 AWS Secrets Manager 等解决方案安全地存储敏感数据,如 ClientSecrets 和 JWT 签名密钥。避免直接在源代码或配置文件中对它们进行硬编码,以防止泄漏。
将 ASP.NET Core 应用程序配置为强制实施 HTTPS 以保护通信通道,从而保护令牌和敏感数据不被拦截。
app.UseHttpsRedirection();
身份验证和授权是保护 ASP.NET Core 中的 Web 应用程序不可或缺的一部分。借助 ASP.NET Core 8 中的新功能(例如默认 PKCE 和改进的方案处理),开发人员可以构建更安全、更简化的应用程序。