Auth0, с расширением авторизации и авторизацией ASP.NET - PullRequest
0 голосов
/ 29 августа 2018

Я работаю над проектом, использующим Auth0. Мы хотим использовать систему разрешений в Расширении авторизации для ее настройки.

например. Роль администратора: пользователей: viewAll пользователи: редактировать пользователи: хуг

Роль пользователя: пользователей: editOwn пользователей: viewOwn пользователей: ЭСТ

И затем в Проекте, если возможно, используйте тег [Authorize (Policy = "users: kvm")].

Однако я не могу найти никаких ресурсов о том, как на самом деле использовать расширение авторизации из Auth0. Я в полной растерянности, поэтому, если бы кто-нибудь мог подсказать мне, где их искать, я был бы очень счастлив.

Ответы [ 5 ]

0 голосов
/ 12 июля 2019

Для простой настройки вы можете установить роли через графический интерфейс Auth0 и использовать правило для применения этого к пользователю:

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"); });
}

А в контроллере например:

[Authorize(Roles = "Administrator, User")]
<<your code>>
0 голосов
/ 28 марта 2019

Я хочу добавить, как я использую его как в старых приложениях .NET MVC, так и в API .NET Core 2.0, так как надеюсь, что это сэкономит кому-то много времени, которое я потратил, пытаясь выяснить это.

Если вам нужно просто получить группы, разрешения, роли и обновить учетные записи пользователей в auth0, следуйте инструкциям @StV.

Но если вы хотите проверить разрешения / роли и т. Д. В .NET, то вот как я это сделал:

Добавьте группы, роли и разрешения либо в токен доступа, либо в Id-токен (или в оба). Для этого следуйте инструкциям здесь

После того, как вы опубликуете правила из вышеприведенного шага настройки, вы должны будете самостоятельно создать другое правило в 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;
}

Я использую вышеупомянутое, чтобы совершать отдельные вызовы для проверки разрешений, но вы можете (и, вероятно, должны) написать свой собственный атрибут авторизации или, если вы используете .NET Core, вы можете написать промежуточное программное обеспечение AuthorizationHandler для проверки любых утверждений, которые вы хотите согласно документация здесь . В приведенном ниже примере проверяются области действия, но вы можете настроить его для проверки разрешений в соответствии с приведенным выше кодом:

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.

0 голосов
/ 06 сентября 2018

Я решил отказаться от авторизации auth0 и самостоятельно разработать систему.

Не могу обернуться вокруг документации.

0 голосов
/ 07 ноября 2018

Расширение авторизации доступно через API

Вы должны разрешить доступ API и настроить связь между компьютерами, чтобы вы могли достичь конечных точек. (как описано в ссылке)

Затем используйте эту документацию для управления разрешениями, ролями, группами и т. Д.

Каждый запрос должен включать токен (JWT), который вы должны получить заранее от https://yourdomain.auth0.com/oauth/token через запрос POST.

Вы должны указать четыре параметра:

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 для достижения конечных точек. Для начала я бы порекомендовал Почтальон , чтобы проверить конечные точки и проверить, какие звонки вам нужны. Существует удобная коллекция , которую можно использовать с некоторыми настройками.

0 голосов
/ 31 августа 2018

Вы можете использовать Авторизацию Extension, чтобы создать разрешение, представляющее доступ к каждому приложению.

Примечание: при создании разрешения «Имя» должно отражать идентификатор клиента приложения

Пример изображения ниже

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);
}

Надеюсь, это поможет вам в некотором роде.

...