iis - 防止 ClaimsTransformation 在每个 HTTP 请求上运行
问题描述
我有一个针对 .NET 5.0 的 Web 应用程序,我正在尝试实现 Windows 身份验证以及一些授权策略。我们有一个来自另一个应用程序的数据库表,其中包含有关用户角色的信息,所以我使用它来为我的用户设置权限。
我创建了一个 ClaimsTransformer 类:
ClaimsTransformer.cs
public class ClaimsTransformer : IClaimsTransformation
{
// snip constructor which pulls in my DbContext from DI
public async Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
{
var id = ((ClaimsIdentity) principal.Identity);
var ci = new ClaimsIdentity(id.Claims, id.AuthenticationType, id.NameClaimType, id.RoleClaimType);
// snip call to DbContext to get user's role from database
if (roleId == 1 || roleId == 7)
{
ci.AddClaim(new Claim("user-role", "admin"));
}
return new ClaimsPrincipal(ci);
}
}
我有这样的身份验证/授权设置:
启动.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(IISDefaults.AuthenticationScheme);
services.AddTransient<IClaimsTransformation, ClaimsTransformer>();
services.AddAuthorization(options =>
{
options.AddPolicy("Admin", policy =>
policy.RequireClaim("user-role", "admin"));
});
// snip rest of method
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// snip unrelated code
app.UseAuthentication();
app.UseAuthorization();
}
我第一次使用它是在我的_Layout.cshtml
:
@if ((await AuthorizationService.AuthorizeAsync(User, "admin").Succeeded)
{
// Admin nav link
}
问题是,由于AuthorizeAsync
在每个 HTTP 请求上运行,我的 ClaimsTransformer 也每次都运行,访问数据库以检查用户在每个请求上的角色。我想避免这种情况,但我不确定最好的方法。
基本上,我希望系统在用户首次通过身份验证时只检查一次角色。我读到这是将 Windows 身份验证与 IIS 一起使用时应该发生的情况,但我看到角色查询在部署到我的 IIS 服务器时也在每个请求上运行。
我可以轻松地在我的 ClaimsTransformer 中添加一个检查,以查看“用户角色”声明是否存在,如果它不存在,则只点击数据库,但有更好的方法吗?我应该覆盖类似的东西UserClaimsPrincipalFactory
而不是使用 ClaimsTransformer 吗?
解决方案
推荐阅读
- command-line-interface - 多字命令行参数的样式指南规则?
- arrays - 在 bash shell 中使用输出文件中的数组
- python - 与 Tensorflow 中的常规 LSTMCell 相比,使用 CudnnLSTM 进行训练时的结果不同
- python-3.x - 将 Python 模块导入 Sublime Text 3
- .net - Select.Pdf:安全透明方法访问安全关键方法
- ios - NVActivityIndicatorView 在按下按钮时不起作用
- javascript - 自动保存包含多个项目的 PHP 表单并使用 ajax 保存在 mysqli 中
- azure - Web API 和 Azure 移动应用程序,我应该将它们分开吗?
- ios - 由于未捕获的异常“NSUnknownKeyException”而终止应用程序,此类不符合键操作的键值编码
- c# - 限制 Form 的启动行为