Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net Blazor WebAssembly。在布局级别添加Authorize属性_.net_Asp.net Core_Blazor Client Side_Blazor Webassembly - Fatal编程技术网

.net Blazor WebAssembly。在布局级别添加Authorize属性

.net Blazor WebAssembly。在布局级别添加Authorize属性,.net,asp.net-core,blazor-client-side,blazor-webassembly,.net,Asp.net Core,Blazor Client Side,Blazor Webassembly,我从一个VisualStudio模板开始,这是一个新的Blazor WebAssembly,服务器端使用身份验证和web API 我的问题是保护所有页面,而不仅仅是一些页面。我试图补充: @using Microsoft.AspNetCore.Authorization @attribute [Authorize] 到主版面而不是所有页面,但没有任何运气。 我想这样做,因为我正在写一个管理员,我不想让人们看到布局,如果没有连接 我想这样做,因为我正在写一个管理员,我不想 如果没有连接,人们根本

我从一个VisualStudio模板开始,这是一个新的Blazor WebAssembly,服务器端使用身份验证和web API

我的问题是保护所有页面,而不仅仅是一些页面。我试图补充:

@using Microsoft.AspNetCore.Authorization
@attribute [Authorize]
到主版面而不是所有页面,但没有任何运气。 我想这样做,因为我正在写一个管理员,我不想让人们看到布局,如果没有连接

我想这样做,因为我正在写一个管理员,我不想 如果没有连接,人们根本看不到布局

可以理解,当用户未登录时,他们无法进入任何页面,因此此时我们可以跳到登录页面,对吗

如果是,可以通过以下步骤实现:

  • 首先在当前blazor中创建一个重定向tologin.razor页面 项目

    在本页面的
    OnInitializedAsync
    方法中,通过判断 当前有用户登录,如果没有,则重定向到
    登录
    页面

    重定向ToLogin.razor:

    @inject NavigationManager Navigation
    @code {
        [CascadingParameter]
        private Task<AuthenticationState> AuthenticationStateTask { get; set; }
    
        protected override async Task OnInitializedAsync()
        {
            var authenticationState = await AuthenticationStateTask;
    
            if (authenticationState?.User?.Identity is null || !authenticationState.User.Identity.IsAuthenticated)
            {
                Navigation.NavigateTo("Identity/Account/Login", true);
            }
        }
    }
    
  • 最后,在MainLayout.razor页面中,进行了区分 在授权与非授权之间:

    @inherits LayoutComponentBase
    <AuthorizeView>
        <Authorized>
            <div class="sidebar">
                <NavMenu />
            </div>
    
            <div class="main">
                <div class="top-row px-4 auth">
                    <LoginDisplay />
                    <a href="https://docs.microsoft.com/aspnet/" target="_blank">About</a>
                </div>
    
                <div class="content px-4">
                    @Body
                </div>
            </div>
        </Authorized>
        <NotAuthorized>
            <RedirectToLogin />
        </NotAuthorized>
    </AuthorizeView>
    
    @继承LayoutComponentBase
    @身体
    
以下是测试结果:


将@attribute[Authorize]放入\u Imports.razor似乎有效。看见如果找不到路线,接受的答案可能无法正确工作。不过,您可以使用不同的公共布局(而不是主布局)。

太好了,非常感谢。我没能正确地做到这一点,最后我把它包装在一个盒子里。这是相当正确的工作,但我觉得这不是正确的方式。此外,它还会多次附加returnUrl值,我看到您直接使用了Identity/Account/Login。为什么不像在默认模板中那样创建一个中间视图呢?我注意到这就是我失败的原因。如果我使用这个中间页,我会得到一个空白page@Dragouf,实际上,当用户未登录时,您可以定义要跳转到的任何页面。我提供的路径是identity.sure下的登录页面,但由于MainLayout是默认布局,所有页面都不会受到保护。我想这就是为什么当我使用一个包含组件的新页面时会得到一个空白页面的原因,就像在VisualStudio的示例模板中一样?
@inherits LayoutComponentBase
<AuthorizeView>
    <Authorized>
        <div class="sidebar">
            <NavMenu />
        </div>

        <div class="main">
            <div class="top-row px-4 auth">
                <LoginDisplay />
                <a href="https://docs.microsoft.com/aspnet/" target="_blank">About</a>
            </div>

            <div class="content px-4">
                @Body
            </div>
        </div>
    </Authorized>
    <NotAuthorized>
        <RedirectToLogin />
    </NotAuthorized>
</AuthorizeView>