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

时间:2018-10-01 22:34:17

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

我们有一些供应商(以及内部消费者),其中一些在使用我们的API时与我们进行基本身份验证,另一些进行jwt令牌身份验证。我们的控制器使用基本身份验证过滤器或令牌身份验证过滤器进行了注释。有没有一种方法可以将这两种身份验证方法组合在同一个控制器中,具体取决于调用哪种方法?当然,我们可以使用基本或令牌身份验证过滤器来注释每个方法,而不是使用类来注释,但是我想知道是否有更好的方法呢?

1 个答案:

答案 0 :(得分:0)

这可以用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将完成其余工作,以定义用于授权请求的auth方法。

如果您没有将jwt用作承载令牌,请使用UseOAuthAuthorizationServer而不是UseOAuthBearerAuthentication。

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