在 blazor 应用程序中,如果渲染模式设置为 "server",是否可以获得请求的路径?

In a blazor app, is it possible to get the requested path, if the render mode is set to "server"?

我创建了一个 Blazor 客户端应用程序,并且在这个应用程序中我有许多具有自定义要求和处理程序的授权策略。其中之一检查 URL 中请求的 ID,并检查登录用户是否可以查看此资源。

例如,用户通过客户端导航到 https://localhost/resource/1f28e41c-bc75-44d6-9eef-d46b66b649c7,这是我 API 上的资源。

我正在使用以下代码查看请求路径:

var httpContext = _httpContextAccessor.HttpContext;
string requestedPath = httpContext.Request.Path.ToString();

这曾经有效,requestedPath 确实包含值“1f28e41c-bc75-44d6-9eef-d46b66b649c7”

但是,在 _Host.cshtml 中,我已将渲染模式从 "ServerPrerendered" 更改为 "Server"。这是因为在页面调用过程中,代码在不同的地方执行了两次。

并且由于我更改了此设置,因此 requestedPath 值始终为“/_blazor”。

所以我想知道,在 blazor 应用程序中,如果渲染模式设置为 "server" 是否可以获取请求的路径?

I created a Blazor client app

不,你没有。您的应用程序是 Blazor Server App(也称为服务器端 Blazor 应用程序)。

由于您的应用是基于 WebSocket 连接的,而不是基于 HTTP 的,因此您不能也不应该尝试访问 HttpContext 对象。 HttpContext 在基于 SignalR 的应用程序中不存在,例如您使用的应用程序 (Blazor Server App)。

以下代码片段创建了一个名为 Profile 的 Razor 组件,带有一个名为 ID 的参数(路由值),您应该将其传递给您的 IAuthorizationHandler

Profile.razor

@page "/profile"
@page "/profile/{id}"

 <AuthorizeView Policy="Place here the name of your policy" 
                                                Resource="@ID">
      <NotAuthorized>
        <h2 class="mt-5">You are not authorized to view this page</h2>
      </NotAuthorized>
      <Authorized>
        <div class="container my-profile">
            <h2>My Profile</h2>
            --- Place here all the content you want your user to view ----
        </div>
      </Authorized>
</AuthorizeView>

@code {

   [Parameter]
   public string ID { get; set; }

}

请记住:配置文件 ID 通过 AuthorizeView.Resource 属性传递给您的处理程序方法

并且在处理程序方法中,您可以执行如下操作:

 public Task HandleAsync(AuthorizationHandlerContext context)
    {
        if (context == null) return Task.CompletedTask;

        // get the profile id from resource, passed in from the profile page 
        // component
        var resource = context.Resource?.ToString();
        var hasParsed = int.TryParse(resource, out int profileID);
        if (hasParsed)
        {
            // compare the requested profileID to the user's actual claim of 
            // profileID
            var isAuthorized = profileID == context.User.GetProfileIDClaim();
            -- --- I can't code blindly any more-----
        }

    }

希望这对您有所帮助..