【问题标题】:How to limit an aspnet core Action for specific Roles with Auth0 and JWT如何使用 Auth0 和 JWT 限制特定角色的 aspnet 核心操作
【发布时间】:2019-12-13 12:13:54
【问题描述】:

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

我现在想限制服务器端,以便除非用户具有访问该端点所需的必要角色,否则无法调用该端点。

令人讨厌的是,Auth0 似乎不支持在 rolesrole 声明中添加 aspnet 核心似乎可以处理 OOTB;它要求域以声明定义中的角色开头。即,https://bob.com/roles 作为声明。

我正在尝试研究如何获取 Authorize(Roles = "Administrator") 属性以兑现以域开头的角色声明。

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

我找到了有关更具体的身份验证提供程序的其他信息,它们在 ClaimActions 上包含一个 MapJsonKey 扩展名,看起来符合要求,但 AddAuthentication 扩展名中的标准 AuthenticationOptions 对象不好像有这个。

我在 App.cs 中的 ConfigureServices

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 core Action(取自示例项目,但添加了身份验证)

[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 映射到roles,获取aspnet 核心Authorize 属性以查看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 Core JWT 中间件中使用角色 https://www.jerriepelser.com/blog/using-roles-with-the-jwt-middleware/

【问题讨论】:

    标签: jwt roles auth0 asp-net-core-spa-services


    【解决方案1】:

    对于发现此问题的任何人,我找到了解决方案。如果您将 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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-11
      • 1970-01-01
      • 2019-07-25
      • 2018-10-25
      • 2019-03-26
      • 2020-04-28
      • 2016-08-22
      • 2011-01-26
      相关资源
      最近更新 更多