当前位置: 首页 > 知识库问答 >
问题:

如何使用Auth0和JWT限制特定角色的aspnet核心操作

齐冥夜
2023-03-14

我正在使用React创建一个PWA,并使用Auth0作为身份提供者,使用JWT承载令牌作为身份验证。我将角色注入到我的JWT令牌中,这样客户端就可以限制用户可以使用的选项,我的工作非常好。

我现在想限制服务器端,这样就不能调用终结点,除非用户具有访问该终结点所需的必要角色。

令人烦恼的是,Auth0似乎不支持添加角色角色声称aspnet核心似乎可以处理OOTB;它要求域在声明定义中的角色之前。ie,https://bob.com/roles作为索赔。

我试图找出如何获得授权(角色=管理员)属性来尊重角色的域前缀声明。

我已尝试更新Auth0规则以设置角色角色属性,但这些属性从未返回;似乎只有域前置角色声明返回。

我找到了更多特定身份验证提供商的其他信息,其中包括AddAuthentication扩展中的MapJsonKey扩展,看起来它们符合要求,但是AddAuthentication扩展中的标准AuthenticationOptions对象似乎没有此功能。

应用程序中的我的配置服务。反恐精英

public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

            // 1. Add Authentication Services
            services.AddAuthentication(options =>
            {
                options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            }).AddJwtBearer(options =>
            {
                options.Authority = Configuration["Auth0:Authority"];
                options.Audience = Configuration["Auth0:ClientId"];
            });

            // In production, the React files will be served from this directory
            services.AddSpaStaticFiles(configuration =>
            {
                configuration.RootPath = "ClientApp/build";
            });
        }

我在Auth0中将角色注入JWT的规则:

function (user, context, callback) {
  const namespace = 'http://bob.com';
  const assignedRoles = (context.authorization || {}).roles;

  let idTokenClaims = context.idToken || {};
  let accessTokenClaims = context.accessToken || {};

  idTokenClaims[`roles`] = assignedRoles; // This was an attempt to set the roles in 'roles' but doesn't get returned.
  accessTokenClaims[`roles`] = assignedRoles;

  idTokenClaims[`${namespace}/roles`] = assignedRoles; // This does get returned
  accessTokenClaims[`${namespace}/roles`] = assignedRoles;

  context.idToken = idTokenClaims;
  context.accessToken = accessTokenClaims;
  callback(null, user, context);
}

JWT有效载荷示例

{
    "http://bob.com/roles": [
        "Administrator"
    ],
    "given_name": "Name",
    "iss": "{issuer}",
    "sub": "{subject}",
    "aud": "{audience}"
}

asp。net核心操作(取自示例项目,但添加了auth)

[HttpGet("[action]"), Authorize(Roles = "Administrator")]
        public IEnumerable<WeatherForecast> WeatherForecasts()
        {
            var rng = new Random();
            return Enumerable.Range(1, 5).Select(index => new WeatherForecast
            {
                DateFormatted = DateTime.Now.AddDays(index).ToString("d"),
                TemperatureC = rng.Next(-20, 55),
                Summary = Summaries[rng.Next(Summaries.Length)]
            });
        }

我希望能够映射http://bob.com/roles角色,获取aspnet coreAuthorize属性以查看http://bob.com/roles,或获取Auth0以能够返回“角色”对象中的角色。

我从哪里得到的MapJsonKey信息:https://docs.microsoft.com/en-us/aspnet/core/security/authentication/social/additional-claims?view=aspnetcore-2.2

将角色与ASP。NET核心JWT中间件https://www.jerriepelser.com/blog/using-roles-with-the-jwt-middleware/

共有1个答案

郤坚诚
2023-03-14

对于任何发现这一点的人,我都找到了解决办法。如果您将JWT声明更新为http://schemas.microsoft.com/ws/2008/06/identity/claims/role然后,所有这些都会立即生效。

更新了Auth0规则

function (user, context, callback) {
  const assignedRoles = (context.authorization || {}).roles;

  let idTokenClaims = context.idToken || {};
  let accessTokenClaims = context.accessToken || {};

  idTokenClaims[`http://schemas.microsoft.com/ws/2008/06/identity/claims/role`] = assignedRoles;
  accessTokenClaims[`http://schemas.microsoft.com/ws/2008/06/identity/claims/role`] = assignedRoles;

  context.idToken = idTokenClaims;
  context.accessToken = accessTokenClaims;
  callback(null, user, context);
}
 类似资料:
  • 我有3个用户角色:管理员、客户和员工。 登录后,每个角色将重定向到特定的仪表板,例如:-管理员:网站。com/admin-客户:网站。com/客户-员工:网站。通讯员/雇员 此时,无论我使用哪个用户角色,都可以通过这些网址访问所有内容。 限制客户打开admin的最简单方法是什么 Laravel版本5.2.45 PHP版本7.2我正在使用共享托管提供商。谢谢你们

  • 我已经创建了自定义中间件类来验证JWT令牌。我在

  • 我试图将对Swagger用户界面(UI)的访问限制为特定角色(例如,Swagger API用户、系统管理员用户等) 我在这个SO问题中尝试了答案--限制对Swagger UI的访问 我想我在等401的未经授权的回复。我对昂首阔步是完全陌生的,所以任何建议都很感激!

  • 我正在尝试限制kubernetes仪表板上的a用户,该仪表板在我创建后连接到kubectl。他和相应的配置的crt。 我成功地限制了他可以使用以下role.yaml 和簇绑定 让他能够进入仪表板。问题是,我只希望他能够访问名称空间。 我已经搜索了一些,一些解决方案似乎涉及创建一个服务帐户,另一个问题可能是因为查看仪表板的权限是在集群角色上授予的,并且无法命名。 有没有最好的方法来解决这个问题?

  • 问题内容: 我需要制作一个只能由具有特定角色的人执行的命令。我在google和youtube上搜索以找到答案,但一无所获 问题答案: 您可以在命令上添加装饰器,以将其限制为仅具有特定角色或权限的成员。它的文档在这里。它看起来像这样: 请记住,您传递的字符串区分大小写。

  • 在我的第一个nodejs应用程序中实现授权时,我遇到了一个问题,该应用程序使用expressjs、sequelize和jsonwebtoken进行身份验证。在内部,我想禁止/允许不同用户的路由,我不想使用另一个包,如oauth2或为我处理授权的东西。 目前,我已经创建了一个jsonwebtoken,它的有效负载中包含权限角色: 否我想在“GET/user”这样的调用中检查是否允许经过身份验证的用户