【问题标题】:Accessing RouteData in Blazor Client Side AuthorizationHandler在 Blazor 客户端 AuthorizationHandler 中访问 RouteData
【发布时间】:2020-02-21 09:18:24
【问题描述】:

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

给定一个 URI,例如 http://localhost:1234/{route}/resource

在页面上,我可以将路由映射到属性,但是如何在 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;
    }
}

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    根据您在问题中的描述,我觉得每件事对您来说都是新事物,所以我建议您start here...

    希望这会有所帮助...

    【讨论】:

    • 感谢您的回复,我已经有了将 JWT 存储在本地存储中并提取声明的代码。您的第一个链接为我指明了一个方向,但很遗憾我不能在页面上使用 Authorize 属性,而只是将 RouteData 注入服务来处理请求。那将是一种更简洁的方法,适合在服务器端和客户端使用相同的代码。
    猜你喜欢
    • 2021-03-31
    • 2020-10-27
    • 1970-01-01
    • 2019-06-06
    • 2019-11-30
    • 2019-10-09
    • 1970-01-01
    • 2022-11-24
    • 1970-01-01
    相关资源
    最近更新 更多