Я хочу добавить, как я использую его как в старых приложениях .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.