0

我在具有角色和所有内容(使用身份)的 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 中的默认身份验证仅限于本地化和其他内容,我不想使用它)

4

1 回答 1

1

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

编辑

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

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

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

然后使用 Intuitive HttpContext.User.IsInRole 和 HttpContext.User.Identity.Name 就像我们在 Web 窗体中所做的那样。

于 2019-07-21T07:19:36.413 回答