我想添加我在旧版 .NET MVC 应用程序和 .NET Core 2.0 API 中的使用方式,因为我希望它可以为我节省大量时间来解决这个问题。
如果您想要的只是在 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 的代码中获取/检查权限。这是我在库方法中如何完成此操作的一些 sn-ps 代码(即不是授权属性):
首先获取您的 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 中间件来检查您想要的任何声明文档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 应用程序编写授权属性。