我有一个很棒的wasm应用程序,它通过IdentityServer4通过oidc进行预渲染和身份验证。我几乎完成了所有设置,一切看起来都很好。我遇到的问题是来自Microsoft.AspNetCore.Components.WebAssembly.Authentication的oidc程序包,似乎有一个强制性的“授权”启动屏幕,无法禁用。在不需要身份验证的页面上进行预渲染时,这意味着用户将看到页面上的数据,然后在一两秒钟后将其替换为全屏身份验证屏幕,然后页面上的数据将返回。 UX太可怕了,我想我必须设置一些错误,这不是它唯一的工作方式,但是对我而言,我自己或通过Google都找不到解决方案……>
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>
这里的问题是我不能简单地删除授权标签。如果我这样做,还是会显示默认页面。如果页面具有“ @attribute [Authorize]”属性或至少没有“ @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>();
答案 0 :(得分:0)
好的,我想我已经提出了一个可以接受的解决方案。有点麻烦,但可以完成工作。
我放弃了在根级别显示身份验证状态的任何尝试。
我的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传递给组件。我最终希望根据父页面的授权属性来自动执行此操作,但是现在可以使用。