我想通过HealthChecksUI创建HealthChecks门户,但权限有限
我还使用Blazor来完成授权对话框的创建和接收访问令牌。
所以我配置HealthChecksUI:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
//...
app.UseEndpoints(endpointsBuilder =>
{
//...
endpointsBuilder.MapHealthChecksUI(setup =>
{
setup.UIPath = "/portal";
setup.ApiPath = "/portal/api";
setup.WebhookPath = "/portal/webhooks";
setup.ResourcesPath = "/portal/resources";
}).RequireAuthorization(); // This means access to '/portal' route will be limited by authorization.
//...
}
//...
}
在执行任何请求时,我使用HTTP授权标头中的承载令牌进行授权。
接下来让我们检查授权工作:
GET请求从POSTMAN到'/portal'路由的有效承载令牌成功通过。此外,如果我更改令牌,则会收到401未经授权的错误。看来授权系统工作正常。
下一步将使用授权对话框来执行令牌接收和重定向到门户页面
下面的代码这只是一个简单的授权函数,使用在.rarzor页面
private async Task SubmitAsync()
{
var (authorizationSuccessful, accessToken) = await authorizationService.AuthorizeAsync(authorizationData).ConfigureAwait(false);
if (authorizationSuccessful)
{
navigationManager.NavigateTo("/portal", true);
}
else
{
throw new UnauthorizedAccessException("Incorrect login or password");
}
}
所以问题是:
当授权传递(authorizationSuccessful
是true
(和执行导航时,我在没有任何授权数据的情况下进入"/portal"页面,因此我得到401未授权错误。
问题是:
如何通过Authorization
HTTP Header中的NavigateTo
方法传递接收到的承载令牌(accessToken
(,以实现对"/portal"页面的授权访问?这可能吗?
不幸的是,用这种方式不可能完成这项任务。
根据只使用JS(this和this(尝试做这样的事情,这是用普通JS做不到的。
所以我们这里只有几个选项:
通过Cookie共享授权令牌
Cookie是基于浏览器的共享存储,因此可以在导航后立即从这里检查访问令牌。
通过查询发送授权令牌
NavigateTo
方法可以与以下查询参数一起使用:
navigationManager.NavigateTo($"/portal?token={accessToken}", true);
因此,我们可以直接从查询参数中检查访问令牌。