我有一个 .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();
在我的 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>
我能够获得基于角色的授权。