owin oauth webapi,带有动态TokenEndpointPath

时间:2015-04-17 16:20:01

标签: owin

我已经在我的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会是什么?

2 个答案:

答案 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);
    }

请注意你在那里所做的事情,因为每次请求都会调用它。