繁体   English   中英

如何在不修改 Identity Server 代码的情况下在 Blazor WASM 中实现基于角色的授权

[英]How to implement role-based authorization in Blazor WASM without modifying Identity Server code

在发布这个问题之前,我在 Internet 上进行了大量研究,我找到了一些东西,但我找不到适合我的情况的东西。 因此,请为我提供正确的方向或代码片段。

我正在.NET 6 中开发一个应用程序,它由两个项目组成:客户端的Blazor WASM项目和我的应用程序 API 的WEB-API 项目

目前,我已经成功地从中央身份服务器 4实现了身份验证。 我收到“id_token”和“access_token”,并使用它们来保护未经身份验证的用户对我的 Web API 的访问。

问题是现在我想实现“基于角色的授权”。 事实是:

  • 我无法修改我使用的通用身份服务器的代码。
  • 我的应用程序数据库中有用户、角色及其连接。

我认为这里正确的解决方案是实现一个MIDDLEWARE ,它从我的数据库中读取角色并将它们添加到“声明”中。

我应该在哪里开发中间件? Web-Api 项目,blazor 项目或两者兼而有之???

如果我在 Web-Api 项目中开发了一个中间件(默认情况下已经有一个管道),它将角色添加到“access_token”的声明中,那么 blazor 项目将无法工作,因为修改了令牌,对吧???

您能帮我提供代码片段或提供正确的方向吗?

感谢您的时间!!!

授权完全是 API 的责任:

  • Blazor 应用通过主题声明发送访问令牌以识别用户
  • API 验证每个请求的 JWT,然后查找该主题的其他声明
  • 可以为具有相同访问令牌的后续请求缓存额外的声明

我的示例 .NET API 展示了一种执行此操作并构建自定义 ClaimsPrincipal 的方法。 完成此操作后,.NET 的标准授权技术(例如 [Authorize] 属性)将根据 ClaimsPrincipal 的内容起作用。

客户端在每个请求中发送 access_token。 服务器验证 access_token,然后使用包含在令牌中的声明创建 ClaimsPrincipal。 在您的服务器中,可以使用 OnTokenValidated 事件向 ClaimsPrincipal 添加其他声明。 例子:

.AddJwtBearer("Bearer", options =>
{
    options.Events = new JwtBearerEvents
    {
        OnTokenValidated = async context =>
        {
            var user = context.Principal;
            var userId = user.FindFirstValue(ClaimTypes.NameIdentifier);

            // Get DbContext. If you don't use Entity Framework request your own data access service.
            //var dbContext = context.HttpContext.RequestServices.GetRequiredService<AppDbContext>();

            // Retrieve user roles from database and create a list of role claims.
            var claims = new List<Claim>
            {
                new Claim(ClaimTypes.Role, "admin")
            };

            var claimsIdentity = new ClaimsIdentity(claims);

            user.AddIdentity(claimsIdentity);
            await Task.CompletedTask;
        }
    };
});

然后在您的控制器中,您可以使用[Authorize(roles = "admin")]User.IsInRole("admin");检查角色 .

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM