我们可以将身份server4中的用户限制为特定应用程序吗?

时间:2017-03-07 08:47:59

标签: authentication identity identityserver4

我正在尝试为企业方案实施IdentityServer 4.

我了解用户是在身份服务器上注册的。

我的问题是如何根据应用程序向用户授予权限,例如,如果未分配应用程序,则需要将用户分配给特定应用程序。

如果用户需要访问多个应用程序,则需要进行多项分配。

如果用户无法一次性访问应用程序,我正在寻找一种让身份服务器使提交的令牌无效的方法,即使受质疑的令牌可能是有效的,如果它是由其他应用程序提交的用户有权访问

6 个答案:

答案 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将验证用户是他们所说的人,而不是明确告诉您该用户可以做什么。

您可以使用作为该身份验证的一部分返回的声明,然后在您的应用中执行授权检查。例如,您可以使用subid声明从您的应用中检查是否允许与该子/ ID关联的用户访问特定资源。

当您将role声明带入图片时,水会变得有点混乱,但只要您了解身份验证和授权之间的区别,就应该没问题。

答案 4 :(得分:0)

在我们的企业场景中,我们将其分为几层:

  • 我们介绍了一个租户-我们企业的客户(组织) 解。
  • 然后,我们将角色分配(不超过20个) 每个特定的用户。

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才能将用户重定向回登录页面,用户可以使用应用程序允许的用户详细信息登录