我已经在我的WebApi 2服务器中使用OWIN成功实现了oAuth:
app.UseOAuthAuthorizationServer(new OAuthAuthorizationServerOptions {
TokenEndpointPath = new PathString("/api/TokenByPassword"),
// ...
});
但是,我希望TokenEndpointPath是动态的,因为我将拥有多个数据库,每个数据库都有自己的帐户记录。
我相信我想要的东西:
TokenEndpointPath = new PathString("/api/{databaseid}/TokenByPassword");
我不相信OAuthAuthorizationServerOptions支持这一点,即使它确实如此 - 我如何获得数据库?
我可以在我自己的带有AttributeRouting的WebAPI中实现它,但是那个在WebAPI中生成正确的OWIN调用以生成正确的BearerToken会是什么?
答案 0 :(得分:2)
我找到了答案..
即使在OAuthAuthorizationServerOptions中指定了TokenEndpointPath,OAuthAuthorizationServerProvider也有一个名为OnMatchEndpoint的委托。在此委托中,您可以访问该调用的Request.Uri.AbsolutePath,如果它符合您的条件,您可以调用MatchesTokenEndpoint(),在这种情况下将调用OnGrantResourceOwnerCredentials,您可以再次访问Request.Uri并选择out {databaseid}并使用正确的数据库授予访问权限。
OWIN是非常灵活的,但并不是很明显,当它不是那么简单时,它会立即调用什么来做你想做的事。
答案 1 :(得分:0)
为了更清楚,这里是扩展OAuthAuthorizationServerProvider的类的函数MatchEndpoint的实现,正如David Snipp建议的那样:
private const string MatchTokenUrlPattern = @"^\/([\d\w]{5})\/token\/?$";
public override async Task MatchEndpoint(OAuthMatchEndpointContext context)
{
var url = context.Request.Uri.AbsolutePath;
if (!string.IsNullOrEmpty(url) && url.Contains("token"))
{
var regexMatch = new Regex(MatchTokenUrlPattern).Match(url);
if (regexMatch.Success)
{
context.MatchesTokenEndpoint();
return;
}
}
await base.MatchEndpoint(context);
}
请注意你在那里所做的事情,因为每次请求都会调用它。