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

时间:2020-08-27 17:13:01

标签: c# .net authentication authorization blazor

我有一个很棒的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>();

1 个答案:

答案 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传递给组件。我最终希望根据父页面的授权属性来自动执行此操作,但是现在可以使用。