我正在使用Identity Server3。我有几个应用程序,即。已配置Client
,并配置了很少的用户。如何建立用户与客户端之间的关系,以及如何查看所选用户有权访问的所有应用程序。
更新1
如果问题令人困惑,我感到抱歉。在IdSvr3主页上,有一个链接可以撤消应用程序权限。我猜想为了撤销权限,您必须首先建立用户与应用程序之间的关系。
并且我想知道在添加新用户时如何建立该权限?
答案 0 :(得分:0)
没有直接方法将一个或多个用户限制为某个客户端。在这里,您应该考虑实现自己的自定义验证。幸运的是,IdentityServer
为这种要求提供了可扩展性。
您应该实现此接口,以进一步验证用户是否属于特定客户端,并将其过滤掉。您可以通过查看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作业。