带有授权标头和承载令牌的Blazor导航

时间:2020-03-11 11:43:36

标签: c# routing navigation authorization blazor

我想通过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授权标头中的 bearer令牌进行授权。

接下来让我们检查授权工作:
来自 POSTMAN 的GET请求(带有有效的承载令牌)成功通过“ / portal”路由。另外,如果我更改令牌,则会收到401未经授权的错误。看来授权系统工作正常。

下一步将使用授权对话框来执行令牌接收并重定向到门户页面。
下面的代码只是在.razor页面中使用的简单授权功能

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");
    }
}

问题是:
当通过授权(authorizationSuccessfultrue)并执行导航时,我进入没有任何授权数据的“ / portal”页面,因此出现401 Unauthorized错误。

问题是:

如何通过accessToken HTTP标头中的NavigateTo方法传递接收到的承载令牌(Authorization),以完成对“ /门户”页面的授权访问?甚至有可能吗?

1 个答案:

答案 0 :(得分:1)

不幸的是,不可能以这种方式完成这项任务。

根据尝试仅使用JS(thisthis)来做类似的事情,纯JS无法做到。

所以我们这里只有几个选择:

通过cookie共享授权令牌

Cookie是基于浏览器的共享存储,因此导航后可以立即从此处检查访问令牌。

通过查询发送授权令牌

NavigateTo方法可与以下查询参数一起使用:

navigationManager.NavigateTo($"/portal?token={accessToken}", true);

因此我们可以直接从查询参数中检查访问令牌。