如何解决防止 ClaimsTransformation 在每个 HTTP 请求上运行
我有一个面向 .NET 5.0 的 Web 应用程序,我正在尝试实施 Windows 身份验证以及一些授权策略。我们有一个来自另一个应用程序的数据库表,其中包含有关用户角色的信息,因此我使用它来为我的用户设置权限。
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);
}
}
我的身份验证/授权设置如下:
Startup.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 吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。