Web api有2个管道,每个管道都有不同的身份验证

时间:2016-10-14 15:41:58

标签: c# asp.net-web-api2 owin katana

我正在开发一个包含2个端点A和B的Web Api,我需要使用A的BasicAuthentication和B的自定义验证。我试图不在2个项目中拆分代码,为此我使用OWIN和2管:

        app.Map("/api/A", basicAuth =>
        {                
            basicAuth.UseBasicAuthentication(container);
        });

        app.Map("/api/B", idTokenAuth =>
        {                
            idTokenAuth.UseBearerAuthentication(container);
        });

我遇到的问题是,在身份验证之后,它不会重定向到相应的控制器并始终返回HTTP / 1.1 404 Not Found。

任何提示?

1 个答案:

答案 0 :(得分:1)

我假设你有app.UseWebApi?在这里使用Map的麻烦在于,当它完成时它不会重新加入父管道(尽管它会落到IIS / MVC中)。这是一个类比......

你想要的是:

if (path.startswith("/api/a")) { DoBasicAuth(optionsA); } if (path.startswith("/api/b")) { DoBasicAuth(optionsB); } DoWebApi();

但Map实际上做的是:

if (path.startswith("/api/a")) { DoBasicAuth(optionsA); return; } if (path.startswith("/api/b")) { DoBasicAuth(optionsB); return; } DoWebApi();

我们已经提出了您可以遵循的不同UseWhen模式,但您必须复制源并将其移植到后端: https://github.com/aspnet/HttpAbstractions/blob/dev/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UseWhenExtensions.cs