在Blazor客户端AuthorizationHandler中访问RouteData

时间:2020-02-21 09:18:24

标签: c# dependency-injection blazor blazor-client-side asp.net-blazor

我目前正在学习Blazor客户端(WebAssembly),并且在查看授权时,我试图验证用户是否可以访问URI中的路径。

给出一个类似http://localhost:1234/ {route} / resource的URI

在页面上,我可以将路由映射到属性,但是如何在AuthorizationHandler中访问此值以验证JWT是否对此值声明?

我尝试注入RouteData,并尝试通过IHttpContextAccessor访问HttpContext,但这是空的。

这是我正在尝试上的课

public class RouteDataAccessor : IRouteDataAccessor
{
    private readonly RouteData _routeData;
    public RouteDataAccessor(IHttpContextAccessor httpContextAccessor)
    {
        httpContextAccessor.NullCheck(nameof(httpContextAccessor));
        httpContextAccessor.HttpContext.NullCheck(nameof(httpContextAccessor.HttpContext));

        _routeData = httpContextAccessor.HttpContext.GetRouteData();
    }

    public bool TryGetData(string key, out string value)
    {
        value = null;
        if (_routeData == null || !_routeData.Values.TryGetValue(key, out value))
        {
            return false;
        }

        return true;
    }
}

1 个答案:

答案 0 :(得分:1)

首先,您不能在WebAssembly Blazor应用程序或Server Blazor应用程序中使用HttpContext。 以下指向我的答案的链接将教您如何操作
pass a value到您的AuthorizationHandler。此外,它还说明了如何使用AuthorizeView组件来保护您的内容并仅允许授权用户访问。

然后参见this answer来了解如何将Jwt令牌保存在本地存储中,如何检索它以及如何使用它执行HTTP调用。

注意:这里缺少从Jwt令牌中提取声明并将其传递给AuthorizationHandler的方法。这值得一个新问题...

您还需要实现StateAuthenticationProvider,它可以与我的答案中显示的Jwt令牌机制结合使用(我称它为TokenProvider)

从您对问题的描述中,我得到的印象是,每件事对您来说都是新事物,所以我建议您start here...

希望这对您有帮助...