我有一个C#API,它使用IdentityServer3来授权对方法的调用。
我想限制某个客户端可以访问哪些调用。客户端正在使用客户端凭据流,我正在尝试找到一种基于客户端ID授权呼叫的方法。
有没有办法开箱即用,还是需要编写自定义过滤器?
答案 0 :(得分:1)
添加身份验证管理器如何 - 如果您查看Identity Server示例,例如" MVC身份验证"一,它在启动时注册一个自定义身份验证管理器,然后使用漂亮的简单资源属性来保护每个Controller操作。
e.g。这是你的创业公司
app.UseResourceAuthorization(new AuthorizationManager());
然后定义您的自定义Auth管理器类,如....
public class AuthorizationManager : ResourceAuthorizationManager
{
public override Task<bool> CheckAccessAsync(ResourceAuthorizationContext context)
{
switch (context.Resource.First().Value)
{
case "PageAuthCheck":
return AuthorizeContactDetails(context);
default:
return Nok();
}
}
private Task<bool> AuthorizeContactDetails(ResourceAuthorizationContext context)
{
switch (context.Action.First().Value)
{
case "Read":
return Eval(context.Principal.Identity.IsAuthenticated);
case "Write":
return Eval(context.Principal.HasClaim("role", "Admin"));
default:
return Nok();
}
}
}
之后,您可以像....一样保护您的控制器操作。
[ResourceAuthorize("Read", "PageAuthCheck")]
显然,这只是一个使用用户声明角色检查的示例,但您应该可以根据客户端ID轻松更改此设置
答案 1 :(得分:0)
你能做的就是拥有一个clientid和一个clientSecret。您只需要实现一个逻辑,检查您的clientid和clientSecret是否有效访问您的应用程序。
检查此示例并根据您的需要进行更新
public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
{
string clientId = string.Empty;
string clientSecret = string.Empty;
Client client = null;
if (!context.TryGetBasicCredentials(out clientId, out clientSecret))
{
context.TryGetFormCredentials(out clientId, out clientSecret);
}
if (context.ClientId == null)
{
//Remove the comments from the below line context.SetError, and invalidate context
//if you want to force sending clientId/secrects once obtain access tokens.
context.Validated();
//context.SetError("invalid_clientId", "ClientId should be sent.");
return Task.FromResult<object>(null);
}
using (AuthRepository _repo = new AuthRepository())
{
client = _repo.FindClient(context.ClientId);
}
if (client == null)
{
context.SetError("invalid_clientId", string.Format("Client '{0}' is not registered in the system.", context.ClientId));
return Task.FromResult<object>(null);
}
if (client.ApplicationType == Models.ApplicationTypes.NativeConfidential)
{
if (string.IsNullOrWhiteSpace(clientSecret))
{
context.SetError("invalid_clientId", "Client secret should be sent.");
return Task.FromResult<object>(null);
}
else
{
if (client.Secret != Helper.GetHash(clientSecret))
{
context.SetError("invalid_clientId", "Client secret is invalid.");
return Task.FromResult<object>(null);
}
}
}
if (!client.Active)
{
context.SetError("invalid_clientId", "Client is inactive.");
return Task.FromResult<object>(null);
}
context.OwinContext.Set<string>("as:clientAllowedOrigin", client.AllowedOrigin);
context.OwinContext.Set<string>("as:clientRefreshTokenLifeTime", client.RefreshTokenLifeTime.ToString());
context.Validated();
return Task.FromResult<object>(null);
}
您还可以查看本教程here