Ano*_*ous 5 c# .net-core asp.net-core blazor blazor-server-side
我已经使用 .NET Core 3.0 创建了一个新的 Blazor 服务器端项目,并且已经关闭了未经过身份验证的用户的应用程序。
我现在试图通过将 [AllowAnonymous] 放在文件顶部来允许匿名访问 Index.razor 组件。然而,这似乎并没有做任何事情。
设想
使用默认的 Blazor 模板“WeatherForecast”后,我将以下内容添加到Startup.cs
services.AddMvcCore(options =>
{
var policy = new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build();
options.Filters.Add(new AuthorizeFilter(policy));
});
Run Code Online (Sandbox Code Playgroud)
如果用户未通过身份验证,这段代码会阻止对我的应用程序的所有请求。
添加那段代码后,我想为未经身份验证的用户打开默认的Index.razor组件。我通过将@attribute [AllowAnonymous]添加到 Index.razor 来做到这一点:
@page "/"
@attribute [AllowAnonymous]
<h1>Hello, world!</h1>
Welcome to your new app.
Run Code Online (Sandbox Code Playgroud)
应用程序.razor
<Router AppAssembly="@typeof(Program).Assembly">
<Found Context="routeData">
<AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" />
</Found>
<NotFound>
<CascadingAuthenticationState>
<LayoutView Layout="@typeof(MainLayout)">
<p>Sorry, there's nothing at this address.</p>
</LayoutView>
</CascadingAuthenticationState>
</NotFound>
</Router>
Run Code Online (Sandbox Code Playgroud)
预期结果
运行我的应用程序时,未经身份验证的用户将被允许访问https://localhost:XXXX的索引页面
实际结果
我的用户被转发到我的 OpenIdConnect URI。
您需要将整个 Blazor 应用程序视为 ASP.NET Core 的单个 html 页面。换句话说,Blazor 应用程序托管在单个 html 页面中。这就是为什么它被称为单页应用程序框架:)
如果用户无权访问该单个页面,则任何 Blazor 代码都无关紧要。
@attribute [AllowAnonymous]仅适用于 Blazor 应用程序,但services.AddMvcCore(options => options.Filter.Add(...))不允许用户访问托管 Blazor 应用程序的单个页面。
它与任何其他 SPA 框架相同。如果您有一个托管在 HTML 文件中的 React/Angular/Vue 应用程序,您需要确保用户有权访问该 HTML 文件。
我认为你必须执行以下操作:
修改为 ASP.NET Core 授权以授权您的其他控制器/页面,但允许匿名访问您的整个 blazor 应用程序(所有其他路由)。
我没有尝试过,但是像这样的东西代替了授权过滤器
app.MapRazorPages().RequireAuthorization();
app.MapControllers().RequireAuthorization();
app.MapRazorComponents<App>().AllowAnonymous()
.AddInteractiveServerRenderMode()
Run Code Online (Sandbox Code Playgroud)
修改您的 Blazor 应用程序以授权除 index 之外的所有页面。
| 归档时间: |
|
| 查看次数: |
2426 次 |
| 最近记录: |