我正在使用 Blazor 并创建了一个服务器托管的 Web 应用程序。我必须像 @attribute [Authorize] 这样在页面顶部放置一条授权行,以确保用户已登录。
看来我必须将此行单独添加到每个页面。是否有一个全局设置可以保护应用程序中的所有页面,当然登录页面除外。
谢谢!
我正在使用 Blazor 并创建了一个服务器托管的 Web 应用程序。我必须像 @attribute [Authorize] 这样在页面顶部放置一条授权行,以确保用户已登录。
看来我必须将此行单独添加到每个页面。是否有一个全局设置可以保护应用程序中的所有页面,当然登录页面除外。
谢谢!
我相信这会奏效...将以下代码片段放在 _Imports.razor 文件中
@using Microsoft.AspNetCore.Authorization
@attribute [Authorize]
在这种情况下,当点击索引页面时,用户将被重定向到登录页面。如果要在呈现 Blazor 应用程序之前执行身份验证,请将上面的代码片段添加到 _Host.cshtml 文件中
添加@attribute [AllowAnonymous]
到您希望从身份验证中排除的特定页面,例如索引页面。
您可以通过添加授权回退策略来做到这一点:
services.AddRazorPages();
services.AddAuthorization(options =>
{
options.FallbackPolicy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
});
回退身份验证策略要求对所有用户进行身份验证,但 Razor 页面、控制器或具有身份验证属性的操作方法除外。
这意味着您可以使用 Example @attribute [Authorize]
( attributes ) 的属性来自定义身份验证和授权。
编辑:我实际上发现第一个解决方案存在问题,它不允许我拥有任何不需要授权的端点或页面。我确实找到了这个链接,它就像一个魅力。
我自己正在寻找解决方案,并找到了以下链接。到目前为止,它似乎按预期工作。
新解决方案:
//RedirectToLogin
@inject NavigationManager NavigationManager
@code{
protected override async Task OnInitializedAsync()
{
var returnUrl = "~/" + NavigationManager.ToBaseRelativePath(NavigationManager.Uri);
NavigationManager.NavigateTo($"Identity/Account/Login?returnUrl={returnUrl}", forceLoad:true);
}
//App.razor
<AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)">
<NotAuthorized>
<RedirectToLogin />
</NotAuthorized>
<Authorizing>
<p>Authorizing...</p>
</Authorizing>
</AuthorizeRouteView>
//this in the page I want authorization for
@attribute [Authorize]
旧解决方案:我在 ConfigureServices 中添加了以下内容:
// Add a default AuthorizeFilter to all endpoints
services.AddRazorPages()
.AddMvcOptions(options => options.Filters.Add(new AuthorizeFilter()));