在渲染器应用程序中,如果将渲染模式设置为“服务器”,是否可以获取请求的路径?

时间:2020-02-18 16:17:44

标签: c# blazor httpcontext

我创建了一个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”。这是由于在页面调用期间代码在不同的位置执行了两次。

由于我更改了此设置,所以所请求的路径值始终为“ / _blazor”。

所以我想知道,在渲染器应用程序中,如果将渲染模式设置为“服务器”,是否可以获取请求的路径?

1 个答案:

答案 0 :(得分:3)

我创建了Blazor客户端应用

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

由于您的应用程序是基于WebSocket连接的,而不是基于HTTP的,因此您不能也不应该尝试访问HttpContext对象。在基于SignalR的应用程序中,HttpContext不像您所使用的(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-----
        }

    }

希望这会有所帮助。