我正在尝试为企业方案实施IdentityServer 4.
我了解用户是在身份服务器上注册的。
我的问题是如何根据应用程序向用户授予权限,例如,如果未分配应用程序,则需要将用户分配给特定应用程序。
如果用户需要访问多个应用程序,则需要进行多项分配。
如果用户无法一次性访问应用程序,我正在寻找一种让身份服务器使提交的令牌无效的方法,即使受质疑的令牌可能是有效的,如果它是由其他应用程序提交的用户有权访问
答案 0 :(得分:2)
您可以在IdentityServer4的索赔表中(称为“角色”)中添加索赔,并在应用程序中添加一些UI,以通过电子邮件或类似方式授权某人,然后在索赔数据库中设置其角色。而且,您还可以从应用程序中删除授权用户,这应取消向该特定人员分配角色。因此,尽管他/她已成功通过身份验证,但由于您已被授权,因此无法使用您的应用程序。希望这种方法对您有帮助!
答案 1 :(得分:1)
Identity Server绝对在最基本的级别上处理授权。它创建在应用程序授权中必不可少的授权码和access_tokens。没有他们,您将无法获得授权。因此,对于其他人来说,Identity Server不做授权是完全错误的。
我一周前来到这里,为这个同样的问题寻找解决方案。我想通过不授予用户访问令牌来限制用户使用特定的应用程序,如果他们不能满足某些参数(在我的情况下是UserClient表)。幸运的是我有解决方案。 Identity Server 4实现了一些所谓的CustomValidator,它们发生在授权或令牌创建时。他们是
internal class DefaultCustomAuthorizeRequestValidator : ICustomAuthorizeRequestValidator
internal class DefaultCustomTokenRequestValidator : ICustomTokenRequestValidator
public class DefaultCustomTokenValidator : ICustomTokenValidator
当他们被叫时,名字真的说了出来。每个都包含一个方法
public Task ValidateAsync(CustomAuthorizeRequestValidationContext context)
{
return Task.CompletedTask;
}
有事吗?没错!它什么也没做。几乎就像是要替换它们一样。 (它是)。
这是您可以添加自定义逻辑以拒绝请求的区域。 CustomAuthorizeRequestValidationContext包含ClientId和用户声明信息。它还包含一个称为IsError的布尔值。只需将其设置为true即可!拒绝访问。您还可以设置错误消息等。这是一个实现ICustomAuthorizeRequestValidator接口的示例,该接口将根据用户ID限制用户。
public Task ValidateAsync(CustomAuthorizeRequestValidationContext context)
{
var sub = context.Result.ValidatedRequest.Subject.FindFirst("sub");
if (sub != null && sub.Value != "88421113")
{
context.Result.IsError = true;
context.Result.Error = "Unauthorized";
context.Result.ErrorDescription = "You are not authorized for this client";
}
return Task.CompletedTask;
}
可以随意插入一两个dbcontext来读取userclient表。我检查子声明是否为空,因为在实际登录之前,它将多次被击中。
从我发现的角度来看,这三个在使用方面表现相似,但在结果方面却有所不同。设置错误ICustomAuthorizeRequestValidator将阻止重定向到您的客户端,而是将您定向到Identity Server错误屏幕。其他两个将重定向回客户端,并且通常会抛出一些HttpResponse错误。因此,替换ICustomAuthorizeRequestValidator似乎效果最好。
因此只需创建一个实现ICustomAuthorizeRequestValidator的类。然后像这样
将其添加到您的身份服务中services.AddIdentityServer().AddCustomAuthorizeRequestValidator<MyCustomValidator>()
您已经完成了。
答案 2 :(得分:0)
对于用户,IdentityServer仅为身份验证。授权应由您的申请处理。
身份验证=验证用户是谁
授权=验证用户可以执行的操作
答案 3 :(得分:0)
正如Scott所说,Identity Server将验证用户是他们所说的人,而不是明确告诉您该用户可以做什么。
您可以使用作为该身份验证的一部分返回的声明,然后在您的应用中执行授权检查。例如,您可以使用sub
或id
声明从您的应用中检查是否允许与该子/ ID关联的用户访问特定资源。
当您将role
声明带入图片时,水会变得有点混乱,但只要您了解身份验证和授权之间的区别,就应该没问题。
答案 4 :(得分:0)
在我们的企业场景中,我们将其分为几层:
IdentityServer从租户获取用户并访问API。它执行的唯一预检查是,请求令牌的特定客户端(应用程序)不受特定租户(客户级别许可)的限制,否则我们将显示一条消息并阻止质询响应。
然后我们来到一个应用程序。使用有效令牌,内部有租户和角色。角色到职能的分配在租户中可能是唯一的。因此,应用程序本身使用单独的API执行粒度权限检查。该应用程序可以自由启用或禁用某些功能,甚至可以重定向到IdSrv“对该应用程序的访问被拒绝”中的特殊页面。
使用这种方法,我们可以扩展,可以配置,可以按照我们想要的速度运行。在上一代中,我们拥有“多合一”身份+访问+许可的类怪物系统,因此我们决定拆分。今天,我们在增加新客户(租户)方面没有任何实际限制,平均每个用户有20000个用户。
答案 5 :(得分:0)
另一种方法是,您可以使用IProfileService
中的IdentityServer4.Services
将用户未分配给应用程序/客户端的用户重定向回各自的客户端登录页面
public async Task IsActiveAsync(IsActiveContext context)
{
if (!string.Equals("MyAllowedApplicationId", context.Client.ClientId, StringComparison.OrdinalIgnoreCase))
{
context.IsActive = false;
}
}
您必须设置IsActive = false
才能将用户重定向回登录页面,用户可以使用应用程序允许的用户详细信息登录