Я заблокировал свое приложение, разрешив только авторизованным пользователям в 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>
Спасибо

Этого можно добиться, указав атрибут в самих компонентах бритвы.
Добавление этого атрибута на все страницы, требующие авторизации, будет работать. Просто исключите те страницы, которые должны быть доступны для всех.
@attribute [Authorize]
Спасибо за ваш ответ. Решение ASP.NET 3.1 находится здесь...
Blazor Разрешить анонимность для страницы Razor
Для моего приложения Blazor 6 я сделал следующее...
_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();