如何在 Blazor 版本 8 InteractiveServer 中实现防伪功能?

问题描述 投票:0回答:1

我正在将 Blazor 版本 6/7 服务器转换为版本 8 InteractiveServer。

在版本 6/7 中,我在 _Host.cshtml 中使用以下内容设置了防伪功能

@inject IAntiforgery Xsrf
// ...
<body>
    @{
        var initialTokenState = new InitialApplicationState
            {
                XsrfToken = Xsrf.GetAndStoreTokens(HttpContext).RequestToken,
                Cookie = HttpContext.Request.Cookies[".AspNetCore.Cookies"],
                RemoteIp = HttpContext.GetRemoteIpAddress(Logger)
            };
    }

我将 _Host.cshtml 的内容移至 App.razor,在 App.razor 中,它没有

HttpContext
属性。 本文档讨论了提交表单,但没有讨论如何设置它来呈现页面。当我尝试运行并渲染页面(页面上没有表单)时,我得到:

InvalidOperationException: Endpoint /sitemap (/sitemap) contains anti-forgery metadata, but a middleware was not found that supports anti-forgery.
Configure your application startup by adding app.UseAntiforgery() in the application startup code. If there are calls to app.UseRouting() and app.UseEndpoints(...), the call to app.UseAntiforgery() must go between them. Calls to app.UseAntiforgery() must be placed after calls to app.UseAuthentication() and app.UseAuthorization().

显然,我应该在版本 8 中采取不同的防伪步骤。这在哪里记录?就我而言 - 没有终点。我的应用程序将从渲染模式版本 6/7 服务器升级到版本 8 InteractiveServer。 (谷歌搜索

useantiforgery
只会导致其他人询问这一切。)

更新: 6/7 版方法还取决于:

[Parameter]
public InitialApplicationState? InitialState { get; set; }

现在无效。如果这一切都消失了,那就没问题了。但如果仍然需要

InitialApplicationState
,我在哪里/如何获得它?

blazor blazor-server-side
1个回答
0
投票

警告 - 以下有效。但是,我不知道这是否正确,也不知道这是否会阻止伪造攻击。我正在使用另一个人发现有效的方法,他们似乎不确定这是否正确。但它有效,而且没有其他人回答,所以我认为总比没有答案好。如果得到权威答案我会更新。

我更换了:

app.UseAuthentication();
app.UseAuthorization();

app.MapControllers();
app.MapBlazorHub();
app.MapFallbackToPage("/_Host");

// after all the above - now can map it
if (builder.Environment.IsProduction())
    app.MapHealthChecks("health").AllowAnonymous();

与:

app.UseAuthentication();
app.UseAuthorization();

app.UseAntiforgery();
app.MapRazorPages();

app.MapRazorComponents<App>()
    .AddInteractiveServerRenderMode();

// after all the above - now can map it
if (builder.Environment.IsProduction())
    app.MapHealthChecks("health").AllowAnonymous();

如果这就是所需要的 - Blazor 团队的伟大举措 - 比以前需要的容易得多。

© www.soinside.com 2019 - 2024. All rights reserved.