在不需要的地方禁用 OIDC 授权上的 Blazor "Authorizing"初始屏幕



我有一个blazor-wasm应用程序,它通过IdentityServer4通过oidc进行预提交和身份验证。我几乎把一切都安排好了,一切看起来都很好。我遇到的问题是Microsoft.AspNetCore.Components.WebAssembly.Authentication中的oidc包似乎有一个强制性的";授权";我无法禁用的启动屏幕。在不需要身份验证的页面上进行预呈现,这意味着用户将看到页面上的数据,然后在一两秒钟后,它将被全屏身份验证屏幕取代,然后页面上的信息将返回。用户体验太糟糕了,我想我一定是设置错了,这不可能是它的唯一工作方式,但就我而言,我无法独自或通过谷歌找到解决方案。。。

App.razor

<CascadingAuthenticationState>
<Router AppAssembly="@typeof(Program).Assembly">
<Found Context="routeData">
<AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)">
<NotAuthorized>
<p>Not authorized.</p>
</NotAuthorized>
<Authorizing>
<p>Authorizing</p>
</Authorizing>
</AuthorizeRouteView>
</Found>
<NotFound>
<LayoutView Layout="@typeof(MainLayout)">
<p>Sorry, there's nothing at this address.</p>
</LayoutView>
</NotFound>
</Router>
</CascadingAuthenticationState>

这里的问题是,我不能简单地删除Authorizaing标记。如果我这样做,默认页面无论如何都会显示。我真的很希望我能让它只显示启动屏幕,如果页面有一个"@属性[授权]";属性或至少不具有"@attribute[AllowAnonymous]";。

我遇到包裹的限制了吗?

感谢您对此的指导。

也可能有用,但可能没有。服务是这样设置的。

builder.Services.AddOidcAuthentication<RemoteAuthenticationState, MyRemoteUserAccount>(options =>
{
builder.Configuration.Bind("OidcProviderOptions", options.ProviderOptions);
options.UserOptions.ScopeClaim = JwtClaimTypes.Scope;
options.UserOptions.RoleClaim = JwtClaimTypes.Role;
})
.AddAccountClaimsPrincipalFactory<RemoteAuthenticationState, MyRemoteUserAccount, MyUserFactory>();

好吧,我想我已经想出了一个可以接受的解决方案。这有点麻烦,但能完成任务。

我已经放弃了在根级别显示身份验证状态的任何尝试。

我的App.razor现在看起来像这个

<CascadingAuthenticationState>
<Router AppAssembly="@typeof(Program).Assembly">
<Found Context="routeData">
<RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" />
</Found>
<NotFound>
<LayoutView Layout="@typeof(MainLayout)">
<p>Sorry, there's nothing at this address.</p>
</LayoutView>
</NotFound>
</Router>
</CascadingAuthenticationState>

然后在应用程序的根模板中,我有这样的

@if(AllowAnonymous)
{
@RootBody
}
else
{
<AuthorizeView>
<NotAuthorized>
<p>Not authorized to read page contents.</p>
</NotAuthorized>
<Authorizing>
<p>Authorizing.</p>
</Authorizing>
<Authorized>
@RootBody
</Authorized>
</AuthorizeView>
}

如果我需要禁用身份验证状态,我会将AllowAnonymous=true传递给组件。我想最终根据父页面的授权属性自动实现这一点,但这目前有效。

我想你会在这里的另一个线程中找到你想要的答案。

我还进行了搜索,结果发现解决方案有多简单:

<MudThemeProvider/>
<MudDialogProvider/>
<MudSnackbarProvider/>
<CascadingAuthenticationState>
<Router AppAssembly="@typeof(Program).Assembly" PreferExactMatches="@true">
<Found Context="routeData">
<AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)">
<Authorizing>
@* YOUR CODE HERE *@
</Authorizing>
<NotAuthorized>
@if (!context.User.Identity.IsAuthenticated)
{
<RedirectToLogin />
}
else
{
<p>You know, I have no idea how you got here but this is not a place I let people into!</p>
}
</NotAuthorized>
</AuthorizeRouteView>
</Found>
<NotFound>
<LayoutView Layout="@typeof(MainLayout)">
<p>Sorry, there's nothing at this address, well, yet anyway!</p>
</LayoutView>
</NotFound>
</Router>
</CascadingAuthenticationState>

相关内容

  • 没有找到相关文章

最新更新