Сервер Blazor Разрешить анонимную страницу, если @attribute [Authorized] установлен на host.cshtml

Я заблокировал свое приложение, разрешив только авторизованным пользователям в hosts.cshtml и используя тег AuthorizeView в app.razor. Чистый эффект заключается в том, чтобы заставить всех пользователей перейти на страницу входа, если они не авторизованы.

Это прекрасно работает до тех пор, пока кто-то с более высокой зарплатой, чем я, не решит, что одна или две страницы должны быть анонимными. Установка страницы в @attribute [AllowAnonymous] не имеет никакого эффекта, поскольку страница никогда не будет достигнута.

Есть ли стратегия для реализации этого, надеюсь, в app.razor?

Вот мой hosts.cshtml...


@page "/"

@using Microsoft.AspNetCore.Authorization

@attribute [Authorize]

@namespace U3A.Pages
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@{
    Layout = "_Layout";
}

<component type = "typeof(App)" render-mode = "ServerPrerendered" />

И app.razor выглядит как...

<CascadingAuthenticationState>
    <Router AppAssembly = "@typeof(App).Assembly">
        <Found Context = "routeData">
            <AuthorizeView>
                <AuthorizeRouteView RouteData = "@routeData" DefaultLayout = "@typeof(MainLayout)" />
                <FocusOnNavigate RouteData = "@routeData" Selector = "h1" />
            </AuthorizeView>
        </Found>
        <NotFound>
            <PageTitle>Not found</PageTitle>
            <LayoutView Layout = "@typeof(MainLayout)">
                <p role = "alert">Sorry, there's nothing at this address.</p>
            </LayoutView>
        </NotFound>
    </Router>
</CascadingAuthenticationState>

Спасибо

1
0
83
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Этого можно добиться, указав атрибут в самих компонентах бритвы.

Добавление этого атрибута на все страницы, требующие авторизации, будет работать. Просто исключите те страницы, которые должны быть доступны для всех.

@attribute [Authorize]
Ответ принят как подходящий

Спасибо за ваш ответ. Решение ASP.NET 3.1 находится здесь...

Blazor Разрешить анонимность для страницы Razor

Для моего приложения Blazor 6 я сделал следующее...

  1. Создайте папку в папке Pages под названием Public и в ней...
  2. Создал файл _PublicHost.cshtml
  3. Создал файл _PublicLayout.cshtml
  4. Создал файл PublicApp.razor
  5. Создал файл PublicMainLayout.razor
  6. Создал файл _Imports.rezor
  7. Создал свою общедоступную страницу ClassScheduleView.razor
  8. Изменен MapFallbackToPage в Program.cs

_PublicHost.cshtml

@page "/Public"

@using Microsoft.AspNetCore.Authorization

@attribute [AllowAnonymous]

@namespace U3A.Pages.Public
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@{
    Layout = "_PublicLayout";
}

<component type = "typeof(PublicApp)" render-mode = "ServerPrerendered" />

_PublicLayout.cshtml

Здесь не требуется особых изменений в стандартном файле _Layout.cshtml. Я читал, что <base href = "~/" /> следует заменить на <base href = "~/public" />, но это вызвало исключения с нулевыми ссылками в сторонних компонентах DevExpress. Оставил как есть без проблем.

_Imports.razor

Здесь нет ничего особенного.

PublicApp.razor

<Router AppAssembly = "@typeof(App).Assembly">
    <Found Context = "routeData">
        <RouteView RouteData = "@routeData" DefaultLayout = "@typeof(PublicMainLayout)" />
    </Found>
    <NotFound>
        <LayoutView Layout = "@typeof(PublicMainLayout)">
            <p class = "alert alert-warning">Sorry, there's nothing at this address.</p>
        </LayoutView>
    </NotFound>
</Router>

PublicMainLayout.razor

@inherits LayoutComponentBase

<div class = "page">
    <div class = "container-fluid">
        @Body
    </div>
</div>

@code {

}

ClassScheduleView.razor

Это просто стандартная страница Blazor. Хитрость здесь заключается в том, чтобы обеспечить правильную директиву @page...

@page "/Public/ClassScheduleView"

Программа.cs

app.MapBlazorHub();
app.MapFallbackToPage("/Public/{*path:nonfile}", "/Public/_PublicHost");
app.MapFallbackToPage("/_Host");

app.Run();

Другие вопросы по теме