同一 webapi 控制器中的多种身份验证机制

Multiple authentication mechanisms in the same webapi controller

我们有供应商(和内部消费者),其中一些与我们进行基本身份验证,一些在使用我们的 API 时进行 jwt 令牌身份验证。我们的控制器使用基本身份验证过滤器或令牌身份验证过滤器进行注释。有没有办法根据调用的方法将这两种身份验证方法组合在同一个控制器中?我们当然可以用基本或令牌身份验证过滤器来注释每个方法,而不是注释 class 但我想知道是否有更好的方法来做到这一点?

这可以用 Owin 来完成。在 Startup.cs 文件中,您可以添加类似的内容:

public partial class Startup
{
    public void ConfigureAuth(IAppBuilder app)
    {
        var oAuthOptions = new OAuthBearerAuthenticationOptions
        {
            // your jwt settings
        };

        app.UseOAuthBearerAuthentication(oAuthOptions);

        app.Use(typeof(BasicAuthenticationMiddleWare)); // basic auth middleware           
    }
}

不幸的是,默认情况下 Owin 不支持基本身份验证,您必须为此编写自己的中间件:

public class BasicAuthenticationMiddleWare : OwinMiddleware
{
    public BasicAuthenticationMiddleWare(OwinMiddleware next) : base(next) { }

    public override Task Invoke(IOwinContext context)
    {
        throw new NotImplementedException();
    }
}

有关基本中间件的信息,您可以在此处找到:https://lbadri.wordpress.com/2013/07/13/basic-authentication-with-asp-net-web-api-using-owin-middleware/

关于如何为 owin 配置 jwt,您可以在 google 中找到更多详细信息。如果没有关于您的 jwt 供应商的详细信息,我无法帮助您进行配置。

当您配置 jwt 和基本身份验证时,您只需将 [Authorize] 属性添加到您的控制器或方法中:

[Authorize]
public class AccountController : ApiController
{

}

Owin 将完成其余工作来定义使用哪种身份验证方法来授权请求​​。

如果您不使用 jwt 作为不记名令牌,请使用 UseOAuthAuthorizationServer 而不是 UseOAuthBearerAuthentication。

您还可以使用 Owin 添加其他供应商,例如 Google、Microsoft、Facebook 等。