【发布时间】:2021-10-28 10:29:43
【问题描述】:
我有一个针对 Firebase 进行身份验证的 Blazor 服务器应用程序 (.NET 5)。我正在尝试在经过身份验证后向主体添加声明,但从未调用过 TransformAsync ......知道可能出了什么问题吗?我搜索并使用了与其他帖子相同的示例... 我在 TransformAsync 中设置了一个断点,我希望它在身份验证后被命中,但事实并非如此。
提前致谢!
public class IsAdminClaimsTransformation : IClaimsTransformation
{
public Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
{
var identity = (ClaimsIdentity)principal.Identity;
if (identity.Name.Equals("john", StringComparison.CurrentCultureIgnoreCase))
{
identity.AddClaim(new Claim(ClaimTypes.Role, "admin"));
}
return Task.FromResult(principal);
}
}
启动类
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddLocalization(options => options.ResourcesPath = "Resources");
services.Configure<CookiePolicyOptions>(options =>
{
options.MinimumSameSitePolicy = SameSiteMode.None;
options.Secure = CookieSecurePolicy.Always;
});
services.ConfigureRequestLocalization();
services.AddSingleton<CultureLocalizer>();
services.AddScoped<IAppState,AppState>();
services.AddScoped<IClaimsTransformation, IsAdminClaimsTransformation>();
services.AddScoped<HttpContextAccessor>();
services.AddRazorPages();
services.AddServerSideBlazor()
.AddCircuitOptions(options => options.DetailedErrors = true);
services.AddHttpContextAccessor();
services.AddAntiforgery(o => o.HeaderName = "XSRF-TOKEN");
services.AddDistributedMemoryCache();
services.AddSignalR(e =>
{
e.MaximumReceiveMessageSize = 102400000;
});
services
.AddBlazorise(options =>
{
options.ChangeTextOnKeyPress = false;
})
.AddBootstrapProviders()
.AddFontAwesomeIcons();
services.AddBlazoredLocalStorage();
services.AddLogging(logging =>
{
logging.ClearProviders();
logging.AddConsole();
logging.AddAzureWebAppDiagnostics();
});
services.AddAuthentication();
services.AddAuthorization(options =>
{
options.AddPolicy("AdminRole1", policy =>
policy.RequireClaim("Admin", "Role1"));
});
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env/*, ILoggerFactory loggerFactory*/)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseAuthentication();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseRouting();
app.UseRequestLocalization();
app.UseAuthorization();
// This line has to be before app.UseEndpoints
app.ConfigureCustomExceptionMiddleware();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
endpoints.MapBlazorHub();
endpoints.MapFallbackToPage("/_Host");
});
}
更新
我像这样添加一个空的构造函数
public IsAdminClaimsTransformation()
{
}
并在花括号中设置断点。它被命中了,但不是 TransformAsyc 方法。
如果我在 ConfigureServices 中调用 services.AddAuthentication 和 services.AddAuthorization,我还必须在 Configure 中调用这三个吗?为什么?
我还按照建议重新排序了应用程序。*,但仍然没有命中 TransformAsync 断点
这就是现在的样子:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseRequestLocalization();
app.ConfigureCustomExceptionMiddleware();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
endpoints.MapBlazorHub();
endpoints.MapFallbackToPage("/_Host");
});
}
【问题讨论】:
-
你解决过这个问题吗?我也面临同样的问题。
标签: blazor .net-5 claims asp.net-authorization