我创建了一个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”。
所以我想知道,在渲染器应用程序中,如果将渲染模式设置为“服务器”,是否可以获取请求的路径?
答案 0 :(得分:3)
我创建了Blazor客户端应用
不,你没有。您的应用程序是Blazor Server应用程序(也称为服务器端Blazor应用程序)。
由于您的应用程序是基于WebSocket连接的,而不是基于HTTP的,因此您不能也不应该尝试访问HttpContext对象。在基于SignalR的应用程序中,HttpContext不像您所使用的(Blazor Server App)那样存在。
以下代码段创建了一个名为Profile的Razor组件,并带有一个名为ID的参数(路由值),您应该将该参数传递给IAuthorizationHandler
@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-----
}
}
希望这会有所帮助。