我假设你有过客户端的控制,并请求他们做,这样可以使你的身份服务器的相应电话。
这是可以使用自定义的验证逻辑,毕竟那是ResourceOwnerPassword
流是怎么一回事:客户传递信息的连接/令牌端点和你编写代码来决定什么是信息化手段,并决定是否这足以验证该客户端。你一定会被去人迹罕至的地方,做你想做什么,但因为约定说,客户端传递的信息是一个username
和password
。
在你Startup.ConfigureServices
,你将需要添加一个IResourceOwnerPasswordValidator
的自己的实现,有点像这样:
services.AddTransient<IResourceOwnerPasswordValidator, ResourceOwnerPasswordValidator>();
然后在类中,你可以做的ValidateAsync
方法的任何逻辑,你想,以决定是否将context.Result
设置为成功GrantValidationResult
,或者失败。有一件事可以帮助你,那就是ResourceOwnerPasswordValidationContext
可以访问原始请求。因此,您添加到原始调用connect/token端点的任何自定义字段都将可供您使用。这是你可以添加自定义字段(提供者名称,API密钥等)的地方。
祝你好运!
编辑:以上可以工作,但真的是滥用标准拨款/流。 OP使用IExtensionGrantValidator
接口推出自己的授权类型和认证逻辑的方法更好。例如:
呼叫从客户机到身份服务器:
POST /connect/token
grant_type=my_crap_grant&
scope=my_desired_scope&
rhubarb=true&
custard=true&
music=ska
与DI注册您的扩展补助:
services.AddTransient<IExtensionGrantValidator, MyCrapGrantValidator>();
和实现批验证:
public class MyCrapGrantValidator : IExtensionGrantValidator
{
// your custom grant needs a name, used in the Post to /connect/token
public string GrantType => "my_crap_grant";
public async Task ValidateAsync(ExtensionGrantValidationContext context)
{
// Get the values for the data you expect to be used for your custom grant type
var rhubarb = context.Request.Raw.Get("rhubarb");
var custard = context.Request.Raw.Get("custard");
var music = context.Request.Raw.Get("music");
if (string.IsNullOrWhiteSpace(rhubarb)||string.IsNullOrWhiteSpace(custard)||string.IsNullOrWhiteSpace(music)
{
// this request doesn't have the data we'd expect for our grant type
context.Result = new GrantValidationResult(TokenRequestErrors.InvalidGrant);
return Task.FromResult(false);
}
// Do your logic to work out, based on the data provided, whether this request is valid or not
if (bool.Parse(rhubarb) && bool.Parse(custard) && music=="ska")
{
// This grant gives access to any client that simply makes a request with rhubarb and custard both true, and has music equal to ska. You should do better and involve databases and other technical things
var sub = "ThisIsNotGoodSub";
context.Result = new GrantValidationResult(sub,"my_crap_grant");
Task.FromResult(0);
}
// Otherwise they're unauthorised
context.Result = new GrantValidationResult(TokenRequestErrors.UnauthorizedClient);
return Task.FromResult(false);
}
}
你不会除非使用标准协议(openid connect,oauth),否则可以使用现有的身份服务器客户端。 – rawel
你最终得到了这个工作吗?如果是这样,请分享您的工作方式。 – stt106