要求使用Owin和Web Api的多种身份验证方案并访问目标类

时间:2014-12-03 13:50:21

标签: c# authentication asp.net-web-api owin middleware

我们需要使用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管道短路并立即返回。

我目前的形式中有一些我不喜欢这个实现的东西:

  • 这适用于每个Owin请求。我真正想要它应用的是每个WebAPI路由。这样我们就可以提供不需要通过
  • 进行身份验证的WebApi帮助页面
  • 这真的是处理这个问题的正确方法吗?感觉它应该是一个AuthenticationHandler,但我无法弄清楚如何使它成为必需,即使另一个身份验证方案已经过身份验证

附带问题:我们有一个针对WebApi的版本作为DelegatingHandler。该版本可以通过使用来自webApi的GlobalConfiguration的controllerSelector和actionSelector访问目标方法(IE:如果路由以/ api / users / 1形式进入,我们可以访问UsersController的GET方法)。然后,我们可以检查可能影响我们对HMAC身份验证器的调用的自定义属性的方法。无论如何在Owin做类似的事情吗?

0 个答案:

没有答案