Auth0,具有授权扩展和ASP.NET授权

时间:2018-08-29 12:32:33

标签: c# core auth0

我正在使用Auth0进行项目。我们希望使用授权扩展中的权限系统进行设置。

例如 角色管理员: 用户:viewAll 用户:编辑 用户:xyz

角色用户: 用户:editOwn 使用者:viewOwn 用户:ect

然后在项目中,如果可能,使用[Authorize(Policy =“ users:kvm”)]标签。

但是,我找不到有关如何从Auth0实际使用授权扩展的任何资源。我完全不知所措,所以如果有人可以指导我在哪里寻找这些东西,我会很高兴的。

5 个答案:

答案 0 :(得分:2)

您可以使用授权Extension创建代表访问每个应用程序的权限。

注意:创建权限时,“名称”应反映应用程序的客户端ID

下面的示例图片

enter image description here

然后创建代表每个应用程序的角色,并确保选择了相关权限。

在此示例中:角色名称为“ SampleClientAccess”

enter image description here

  1. 然后创建组并链接您创建的角色。将相关用户添加到组中

enter image description here

  1. 最后一步。转到信息中心>规则>创建自定义规则和以下代码。

function (user, context, callback) { 
      // Assume that permission for an application is the client_id of the permission then
 
     if (user.permissions.indexOf(context.clientID) === -1 ){
         callback(new UnauthorizedError('You are not allowed to access ' + context.clientName + JSON.stringify(user)));
     }
     callback(null, user, context);
}

希望这会对您有所帮助。

答案 1 :(得分:1)

我已经决定放弃auth0的授权,自己设计一个系统。

不能把头围在文档上。

答案 2 :(得分:1)

可通过API

访问授权扩展

您必须启用API访问权限并设置计算机与计算机之间的通信,以便可以访问端点。 (如链接中所述)

然后使用this文档来管理权限,角色,组等。

每个请求都必须包含一个令牌(JWT),您必须事先通过POST请求从https://yourdomain.auth0.com/oauth/token获得该令牌(JWT)。

您必须提供四个参数:

grant_type = client_credentials 
client_id = {from your auth0 application}
client_secret = {from your auth0 application}
audience=urn:auth0-authz-api

将令牌作为"Authorization" : "Bearer #YOURTOKEN#"放入每个请求的标题中

您可以使用任何REST客户端访问端点。首先,我建议Postman测试端点并检查您需要哪些呼叫。您可以方便地使用collection进行一些调整。

答案 3 :(得分:0)

我想补充一下我在旧版.NET MVC应用程序和.NET Core 2.0 API中的使用方式,因为我希望它可以节省很多人花在我身上的时间。< / p>

如果您只是想要在auth0中获取组,权限,角色和更新用户帐户,请按照@StV回答中的步骤进行操作。

但是,如果您要检查.NET中的权限/角色等,那么这就是我的方法:

将组,角色和权限添加到访问或Id令牌(或两者)中。为此,请按照here

的说明进行操作

一旦您从上述配置步骤发布了规则,就必须在Auth0中自己创建另一个规则,以将信息复制到令牌中(这让我花了一段时间)。这必须在Auth0发布/创建的规则之后运行。我的看起来像这样:

function (user, context, callback) {
  if(user.app_metadata) {
    var namespace = 'https://visionplatform.com/';
    context.accessToken[namespace + 'roles'] = user.roles;
    context.accessToken[namespace + 'permissions'] = user.permissions;
    context.idToken[namespace + 'roles'] = user.roles;
    context.idToken[namespace + 'permissions'] = user.permissions;    
  }
  callback(null, user, context);
}

现在,如果用户登录,他们的令牌中将具有其组,角色和权限。但是请记住,会显示您针对其进行身份验证的特定客户端的组,角色和权限(我为此花费了数小时)。

因此,现在您可以获取/检查代码中对JWT进行解码的权限。这是我在库方法中如何完成此操作的一些代码片段(即不是authorize属性):

首先获取您的TokenValidationPrams

public TokenValidationParameters GetTokenValidationParameter(string domain, string audience)
{
    IConfigurationManager<OpenIdConnectConfiguration> configurationManager = new ConfigurationManager<OpenIdConnectConfiguration>($"{domain}.well-known/openid-configuration", new OpenIdConnectConfigurationRetriever());
    var openIdConfig = AsyncHelper.RunSync(async () => await configurationManager.GetConfigurationAsync(CancellationToken.None));

    return new TokenValidationParameters
    {
        ValidIssuer = $"{domain}",
        ValidAudiences = new[] { audience },
        IssuerSigningKeys = openIdConfig.SigningKeys
    };
}

然后解码您的JWT以获取声明

private ClaimsPrincipal GetValidatedToken(string token, TokenValidationParameters validationParameters)
{
    var handler = new JwtSecurityTokenHandler();
    return handler.ValidateToken(token, validationParameters, out var _);
}

现在您可以检查该声明原则,以查看它是否包含您的组,权限或其他任何内容(请注意,我只是在检查权限)。

public bool ValidateTokenClaimsPermissionExists(string token, string domain, string audience, string permission)
{
    var claimsPrincipal = GetValidatedToken(token, _tokenValidationParameters);

    var scopePermission = claimsPrincipal.FindFirst(c => c.Type == Constants.PermissionsClaimTypeName && c.Value == permission);
    return scopePermission != null;
}

我使用上面的方法分别进行调用以检查权限,但是您可以(可能应该)编写自己的authorize属性,或者如果您使用的是.NET Core,则可以编写AuthorizationHandler中间件来检查所需的声明文档here。下面的代码检查范围,但您可以根据上面的代码对其进行调整以检查权限:

protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, HasScopeRequirement requirement)
{
    // If user does not have the scope claim, get out of here
    if (!context.User.HasClaim(c => c.Type == "scope" && c.Issuer == requirement.Issuer))
    {
        return Task.CompletedTask;
    }

    // Split the scopes string into an array
    var scopes = context.User.FindFirst(c => c.Type == "scope" && c.Issuer == requirement.Issuer).Value.Split(' ');

    // Succeed if the scope array contains the required scope
    if (scopes.Any(s => s == requirement.Scope))
        context.Succeed(requirement);

    return Task.CompletedTask;
}

我还将使用以上所有内容为.NET MVC应用程序编写一个authorize属性。

答案 4 :(得分:0)

对于简单的设置,您可以通过Auth0 GUI设置角色,并使用规则将其应用于用户:

function (user, context, callback) {

   // Roles should only be set to verified users.
  if (!user.email || !user.email_verified) {
    return callback(null, user, context);
  }

  user.app_metadata = user.app_metadata || {};

  const assignedRoles = (context.authorization || {}).roles;

  const addRolesToUser = function(user) {
    return assignedRoles;
  };

  const roles = addRolesToUser(user);

  user.app_metadata.roles = roles;
  auth0.users.updateAppMetadata(user.user_id, user.app_metadata)
    .then(function() {
      context.idToken['https://schemas.<yourdomain>.com'] = user.app_metadata.roles;
      callback(null, user, context);
    })
    .catch(function (err) {
      callback(err);
    });
}

您的startup.cs应该具有以下内容:

services.AddAuthorization(options =>
{
  options.AddPolicy("Administrator", authBuilder => { authBuilder.RequireRole("Administrator"); });
  options.AddPolicy("User", authBuilder => { authBuilder.RequireRole("Administrator", "User"); });
}

例如在Controller中:

[Authorize(Roles = "Administrator, User")]
<<your code>>