在身份服务器3中如何将用户与客户端相关联

时间:2018-08-07 17:00:44

标签: identityserver3

我正在使用Identity Server3。我有几个应用程序,即。已配置Client,并配置了很少的用户。如何建立用户与客户端之间的关系,以及如何查看所选用户有权访问的所有应用程序。

更新1
如果问题令人困惑,我感到抱歉。在IdSvr3主页上,有一个链接可以撤消应用程序权限。我猜想为了撤销权限,您必须首先建立用户与应用程序之间的关系。 并且我想知道在添加新用户时如何建立该权限?

enter image description here

1 个答案:

答案 0 :(得分:0)

没有直接方法将一个或多个用户限制为某个客户端。在这里,您应该考虑实现自己的自定义验证。幸运的是,IdentityServer为这种要求提供了可扩展性。

ICustomRequestValidator

您应该实现此接口,以进一步验证用户是否属于特定客户端,并将其过滤掉。您可以通过查看ValidatedAuthorizeRequest.Subject来查看用户详细信息。此自定义验证程序将在验证可选参数(例如现时,提示,arc_values(AuthenticationContextReference),login_hint等)之后启动。端点为AuthorizeEndPointController,定制作业的接口的默认实现为AuthorizeRequestValidator。及其RunValidationAsync。您应该看一下控制器和类。

实施提示

自定义请求验证开始时,将在Client中显示一个ValidatedAuthorizeRequest参考。因此,您需要做的就是匹配client id或您认为需要验证客户端的其他一些标识符。可能您可能希望向客户端添加一个Claim键值对,并希望允许几个用户。

也许是这样。

new InMemoryUser{Subject = "870805", Username = "damon", Password = "damon",
    Claims = new Claim[]
    {
        new Claim(Constants.ClaimTypes.Name, "Damon Jeong"),
        new Claim(Constants.ClaimTypes.Email, "dmjeong@email.com"),
        new Claim(Constants.ClaimTypes.EmailVerified, "true", ClaimValueTypes.Boolean)                                  
    }
}

假设您拥有以上用户,然后将主题ID添加到如下所示的客户的声明中。

new Client
{
    ClientName = "WPF WebView Client Sample",
    ClientId = "wpf.webview.client",
    Flow = Flows.Implicit,

    .
    .
    .

    // Add claim for limiting this client to certain users.
    // Since a claim only accepts type and value as string,
    // You can add a list of subject id by comma separated values
    // eg ( new Claim("BelongsToThisUser", "870805, 870806, 870807") )
    Claims = new List<Claim>
    {
         new Claim("BelongsToThisUser", "870805")
    }
},

然后只需实现ICustomRequestValidator并尝试将Claim的值与其ValidateAuthorizeRequestAsync中的给定用户进行匹配。

public class UserRequestLimitor : ICustomRequestValidator
{
    public Task<AuthorizeRequestValidationResult> ValidateAuthorizeRequestAsync(ValidatedAuthorizeRequest request) 
    {
        var clientClaim = request.Client.claims.Where(x => x.Type == "BelongsToThisUser").FirstOrDefault();

        // Check is this client has "BelongsToThisUser" claim.
        if(clientClaim != null)
        {
             var subClaim = request.Subject.Claims.Where(x => x.Type == "sub").FirstOrDefault() ?? new Claim(string.Empty, string.Empty);
             if(clientClaim.Value == userClaim.Value) 
             {
                 return Task.FromResult<AuthorizeRequestValidationResult>(new AuthorizeRequestValidationResult
                {
                    IsError = false
                });
             }
             else
             {
                 return Task.FromResult<AuthorizeRequestValidationResult>(new AuthorizeRequestValidationResult
                {
                    ErrorDescription = "This client doesn't have an authorization to request a token for this user.",
                    IsError = true
                });
             }
        }
        // This client has no access controls over users.
        else
        {
            return Task.FromResult<AuthorizeRequestValidationResult>(new AuthorizeRequestValidationResult
            {
                IsError = false
            });
        }
    }

    public Task<TokenRequestValidationResult> ValidateTokenRequestAsync(ValidatedTokenRequest request) 
    {
         // your implementation
    }
}

DI的时间

在配置IdentityServer时,需要注入自己的依赖项。授权服务器使用IdentityServerServiceFactory来注册依赖项。

var factory = new IdentityServerServiceFactory();
factory.Register(new Registration<ICustomRequestValidator>(resolver => new UserRequestLimitor()));

然后Autofac IdentityServer 中的IoC容器将为您完成其余的DI作业。