如何为 Blazor 服务器应用程序设置自定义访问拒绝页面

问题描述 投票:0回答:1

我有一个 .NET 8 Blazor Server 应用程序,配置为使用 Microsoft Identity 平台进行身份验证。 该应用程序在 SQL Server 数据库中拥有自己的用户表,用于存储用户信息。 有一个自定义声明转换服务,每个请求都会调用该服务,以从数据库中获取用户信息,然后将其添加到 ClaimsPrincipal。 如果经过身份验证的用户没有用户记录,则会添加“UserNotFound”声明,其值为“true”。 添加了授权策略来检查是否不存在值为“true”的“UserNotFound”声明,如果存在,则应将其重定向到访问被拒绝的页面。 该策略似乎有效,并试图将我重定向到 MicrosoftIdentity/Account/AccessDenied 页面,但重定向不正确。 我想让它重定向到自定义访问拒绝页面。 我已尝试在代码中以及 appsetting.json 中使用其他 AzureAd 设置进行更改,但它仍然尝试使用默认的 Microsoft Identity URL。 有谁知道如何改变这个吗?

这是我的Program.cs:

using Demo.Auth.Blazor3.Components;
using Demo.Auth.Blazor3.Extensions;
using Microsoft.AspNetCore.Authentication.OpenIdConnect;
using Microsoft.Identity.Web;
using Microsoft.Identity.Web.UI;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApp(options =>
    {
        builder.Configuration.GetSection("AzureAd").Bind(options);
    });

builder.Services.AddControllersWithViews()
    .AddMicrosoftIdentityUI();

builder.Services.AddAuthorization(options =>
{
    // Custom policy to ensure user exists and is active
    options.AddPolicy("RequireValidUser", policy =>
    {
        policy.RequireAssertion(context =>
            !context.User.HasClaim(c =>
                (c.Type == "UserNotFound" && c.Value == "true") ||
                (c.Type == "UserArchived" && c.Value == "true")
            ));
    });

    // Set "RequireValidUser" as the FallbackPolicy, applying it globally
    options.FallbackPolicy = options.GetPolicy("RequireValidUser") ?? options.DefaultPolicy;
});

// Add custom services here.
builder.Services.AddCustomServices(builder.Configuration);


builder.Services.AddDistributedMemoryCache();
builder.Services.AddSession();

// Add services to the container.
builder.Services.AddRazorComponents()
    .AddInteractiveServerComponents();

var app = builder.Build();


// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error", createScopeForErrors: true);
    // 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.UseHttpsRedirection();
app.UseStaticFiles();
app.UseAntiforgery();
app.UseSession();

// Add authentication and authorization middleware
app.UseAuthentication();
app.UseAuthorization();

// Map components and configure routes
app.MapRazorComponents<App>()
    .AddInteractiveServerRenderMode();


app.Run();
azure-active-directory blazor .net-8.0
1个回答
0
投票

在我的 Program.cs 文件中添加:

builder.Services.Configure<CookieAuthenticationOptions>(CookieAuthenticationDefaults.AuthenticationScheme, options =>
{
    options.AccessDeniedPath = "/access-denied";
});

我添加了自定义 AccessDenied.razor 组件/页面并使用

@attribute [Authorize(Roles = "Admin,Standard")]

页面顶部或页面中的 AuthorizeView 标签

<CascadingAuthenticationState>
                <AuthorizeView Policy="RequireValidUser" Context="ImpersonationComponent">
                    <Authorized>
                        <Login />
                    </Authorized>
                </AuthorizeView>
            </CascadingAuthenticationState>

我能够获得基于角色的授权。

© www.soinside.com 2019 - 2024. All rights reserved.