【问题标题】:Jwt Authentication doesn't work in Blazor ServersideJwt 身份验证在 Blazor 服务器端不起作用
【发布时间】:2019-07-20 14:44:57
【问题描述】:

我在 Blazor 客户端托管项目中使用了 Jwt 身份验证,其中包含角色和所有内容(使用身份),但是当我在 Blazor 服务器端执行相同操作时它不起作用,例如在我在标头中设置令牌后:

client.DefaultRequestHeaders.Add("Authorization", $"Bearer {Model.Token}");                
            Console.WriteLine($"Is authenticated = {httpContext.HttpContext.User.Identity.IsAuthenticated}");

IsAuthenticated 返回 false,当我导航到主页(导致刷新)时,IsAuthenticated 仍然返回 false,并且无法通过 HttpContext.User.Identity.Name 访问用户名!!是否有解决方法。 (Blazor 服务器端预览版 6 中的默认身份验证仅限于本地化和其他内容,我不想使用它)

【问题讨论】:

    标签: asp.net-identity jwt-auth blazor-server-side


    【解决方案1】:

    我可以在没有 cookie 或标头的情况下解决我的问题,我创建了一个 Auth 类,其中包含用户名、经过身份验证的角色和方法 IsInRole,然后将此类(作为单例)注入到使用或填充此类的每个视图中,然后在成功登录时填充它(我使用 Identity checkpasswordsigninasync)我填充这个类并通过应用程序使用它,在注销时我只是创建一个空实例。 我认为因为一切都在服务器上运行,所以这个类是安全的,它唯一的限制是页面刷新身份验证丢失并且 HttpContext.User 为空。

    编辑:

    首先,在刷新单例服务时不会丢失其数据,因此身份验证模型不会为空。

    第二:如果您觉得这个 Auth 模型让编程不熟悉,我可以在登录时使用 IEnumerable -claims 变量设置 ClaimPrincipal,如下所示:

    httpContext.HttpContext.User = new System.Security.Claims.ClaimsPrincipal(new ClaimsIdentity(claims));
    

    然后像我们在 Web 表单中一样使用 Intuitive HttpContext.User.IsInRole 和 HttpContext.User.Identity.Name。

    【讨论】:

    • 一个奇怪的解决方法,但它可能对某些人有用。但请注意,我们在 frompm preview6 上为服务器端提供了内置身份验证。
    • 由于我使用没有路由参数或查询字符串的本地化系统,并且它在没有页面刷新的情况下工作,我不能使用内置 Blazor 身份验证的本地化,所以我决定暂时使用自定义身份验证的形式,直到将来 Blazor Serverside 支持自定义身份验证。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-24
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    • 2021-02-27
    • 2021-12-05
    相关资源
    最近更新 更多