【问题标题】:TransformAsync not called in Blazor application在 Blazor 应用程序中未调用 TransformAsync
【发布时间】: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


【解决方案1】:

在中间件中,事件的顺序很重要!

 app.UseRouting();
 app.UseAuthentication();
 app.UseAuthorization();

【讨论】:

  • 仍然没有调用
  • 如果我在 ConfigureServices 中调用 services.AddAuthentication 和 services.AddAuthorization 我还必须在 Configure 中调用这三个?为什么?
猜你喜欢
  • 2020-12-18
  • 2021-04-09
  • 1970-01-01
  • 2021-01-18
  • 1970-01-01
  • 1970-01-01
  • 2014-04-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多