动态声明
当客户端进行身份验证并获取访问令牌或身份验证Cookie时,除非重新进行身份验证,否则该令牌或Cookie中的声明不会发生变化。对于大多数声明而言这并非问题,因为声明值通常不会频繁变动。然而,对于某些声明,可能需要在当前会话中声明值更改后立即看到其影响。例如,如果用户的某个角色被撤销,您希望在下一次请求中立即看到这一变化的效果。否则,用户将继续使用该角色的权限,直到重新登录应用程序。
ABP的动态声明功能能够动态地用这些声明的最新值覆盖客户端身份验证令牌/Cookie中已配置的声明值。
使用方法
此功能默认处于禁用状态。您需要为应用程序启用该功能,并使用动态声明中间件。
从 v8.0 版本开始,所有 启动模板 都已预先配置,且动态声明功能默认启用。因此,如果您使用的是v8.0及以上版本创建的解决方案,则无需进行任何配置。仅当您是从低于8.0的版本升级时,才需要遵循以下说明。
启用/禁用动态声明
您可以通过以下代码启用该功能:
public override void ConfigureServices(ServiceConfigurationContext context)
{
context.Services.Configure<AbpClaimsPrincipalFactoryOptions>(options =>
{
options.IsDynamicClaimsEnabled = true; //设置为"true"以启用"动态声明",或"false"以禁用它。
});
}
这通常在身份验证服务器上进行配置。在单体应用程序中,您通常只有一个应用程序,因此可以直接配置。如果您使用的是分层解决方案结构(UI部分托管在单独的应用中),则还需要在UI应用中设置RemoteRefreshUrl指向身份验证服务器的URL。例如:
public override void ConfigureServices(ServiceConfigurationContext context)
{
context.Services.Configure<AbpClaimsPrincipalFactoryOptions>(options =>
{
options.IsDynamicClaimsEnabled = true;
options.RemoteRefreshUrl = configuration["AuthServerUrl"] + options.RemoteRefreshUrl;
});
}
RemoteRefreshUrl已在AddAbpOpenIdConnect和AddAbpJwtBearer方法中预先配置。
动态声明中间件
在所有执行身份验证的应用程序(包括身份验证服务器)中添加DynamicClaims中间件:
public override void OnApplicationInitialization(
ApplicationInitializationContext context)
{
//...
app.UseDynamicClaims(); // 在UseAuthorization之前添加此行。
app.UseAuthorization();
//...
}
工作原理
DynamicClaims中间件会在每个请求中使用IAbpClaimsPrincipalFactory为当前用户(HttpContext.User)动态生成声明。
针对不同场景,提供了三种预构建的IAbpDynamicClaimsPrincipalContributor实现:
IdentityDynamicClaimsPrincipalContributor:由 Identity模块 提供,生成并覆盖实际的动态声明,并写入分布式缓存。通常在分布式系统的身份验证服务器中工作。RemoteDynamicClaimsPrincipalContributor:适用于分布式场景,此实现在UI应用中工作。它会尝试从分布式缓存中获取动态声明值。如果在分布式缓存中未找到,则会向身份验证服务器发起HTTP调用,请求由身份验证服务器填充。需正确配置AbpClaimsPrincipalFactoryOptions.RemoteRefreshUrl以确保其正常运行。WebRemoteDynamicClaimsPrincipalContributor:与RemoteDynamicClaimsPrincipalContributor类似,但在微服务应用中工作。
IAbpDynamicClaimsPrincipalContributor
如果您希望添加自己的动态声明贡献者,可以创建一个实现IAbpDynamicClaimsPrincipalContributor接口的类(并将其注册到 依赖注入 系统中)。ABP将调用ContributeAsync方法来获取声明。由于这是一个频繁执行的方法(在每个HTTP请求中),最好使用某种缓存来提高性能。
AbpClaimsPrincipalFactoryOptions
AbpClaimsPrincipalFactoryOptions是配置动态声明系统行为的主要选项类。它具有以下属性:
IsDynamicClaimsEnabled:启用或禁用动态声明功能。RemoteRefreshUrl:用于刷新缓存的身份验证服务器url。RemoteDynamicClaimsPrincipalContributor将使用此URL。默认值为/api/account/dynamic-claims/refresh,您需要提供身份验证服务器的完整URL,例如http://my-account-server/api/account/dynamic-claims/refresh。DynamicClaims:动态声明类型的列表。只有此列表中的声明才会被动态声明系统覆盖。ClaimsMap:用于映射声明类型的字典。当身份验证服务器和客户端之间的声明类型不同时使用此选项。默认已为常见声明类型设置。
WebRemoteDynamicClaimsPrincipalContributorOptions
WebRemoteDynamicClaimsPrincipalContributorOptions是配置WebRemoteDynamicClaimsPrincipalContributor行为的选项类。它具有以下属性:
IsEnabled:启用或禁用WebRemoteDynamicClaimsPrincipalContributor。默认为false。AuthenticationScheme:用于向身份验证服务器进行HTTP调用身份验证的身份验证方案。
抠丁客


