我们需要使用2种独立的身份验证方案来保护我们的WebApi服务,但我们需要这两种服务。
以下是该方案:
我们有一个内部服务注册表,服务使用者将注册API密钥和共享密钥。然后将它们用于标准模式,以生成应与每次Web服务调用一起发送的HMAC。这些API密钥基本上代表软件系统。
但是,在应用程序级别,我们还希望单独验证我们的用户。我们使用OAuthAuthorizationServerProvider连接到LDAP来验证用户,从内部从我们的应用程序中提取一些角色,然后生成/返回Bearer令牌。
我最初尝试创建一个自定义AuthenticationHandler Owin中间件来实现HMAC方案,但这并不是我想要的。在该场景中,如果HMAC或OAuth经过身份验证,则授予用户访问权限。
我在过渡期间所做的是将HMAC逻辑更改为更通用的OwinMiddleware。以下是我正在做的事情的一般概念:
public class HMACMiddleware : OwinMiddleware
{
private HMACOptions _HMACOptions;
public HMACMiddleware(OwinMiddleware next, IAppBuilder app, HMACOptions options) : base(next)
{
_HMACOptions = options;
}
public override Task Invoke(IOwinContext context)
{
// Pull headers use for HMAC generation, process them and handle any errors
// Authenticate with the external service registry
string authFailureReason;
var authenticated = _HMACOptions.AuthStrategy.DoAuthentication(requestData, out authFailureReason);
if(authenticated)
{
return Next.Invoke(context);
}
else
{
context.response.StatusCode = 401;
contextresponse.ReasonPhrase = "An error occurred authenticating via HMAC";
return context.response.WriteAsync(authFailureReason);
}
}
}
如果HMAC auth失败,我将Owin管道短路并立即返回。
我目前的形式中有一些我不喜欢这个实现的东西:
附带问题:我们有一个针对WebApi的版本作为DelegatingHandler。该版本可以通过使用来自webApi的GlobalConfiguration的controllerSelector和actionSelector访问目标方法(IE:如果路由以/ api / users / 1形式进入,我们可以访问UsersController的GET方法)。然后,我们可以检查可能影响我们对HMAC身份验证器的调用的自定义属性的方法。无论如何在Owin做类似的事情吗?