需要对所有 Blazor 页面进行授权
Require authorization on ALL Blazor pages
我正在玩 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();
});
The fallback authentication policy requires all users to be authenticated, except for Razor Pages, controllers, or action methods with an authentication attribute.
这意味着您可以使用示例 @attribute [Authorize]
(attributes) 的属性来自定义身份验证和授权。
编辑:我实际上发现了第一个解决方案的问题,它不允许我拥有任何不需要授权的端点或页面。我确实找到了这个 link,它很有魅力。
我自己正在为此寻找解决方案,并找到了以下 link。到目前为止它似乎按预期工作。
新解决方案:
//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()));
我正在玩 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();
});
The fallback authentication policy requires all users to be authenticated, except for Razor Pages, controllers, or action methods with an authentication attribute.
这意味着您可以使用示例 @attribute [Authorize]
(attributes) 的属性来自定义身份验证和授权。
编辑:我实际上发现了第一个解决方案的问题,它不允许我拥有任何不需要授权的端点或页面。我确实找到了这个 link,它很有魅力。
我自己正在为此寻找解决方案,并找到了以下 link。到目前为止它似乎按预期工作。
新解决方案:
//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()));