Несколько механизмов аутентификации в одном контроллере webapi - PullRequest
0 голосов
/ 02 октября 2018

У нас есть поставщики (и собственные потребители), некоторые из которых выполняют базовую аутентификацию у нас, а некоторые выполняют аутентификацию токена jwt при использовании нашего API.У нашего контроллера есть аннотации с помощью базового фильтра авторизации или фильтра авторизации токена.Есть ли способ объединить оба этих метода аутентификации в одном контроллере в зависимости от того, какой метод вызывается?Конечно, мы можем аннотировать каждый метод с помощью базовых фильтров или фильтров авторизации токенов вместо того, чтобы аннотировать класс, но мне было интересно, есть ли лучший способ сделать это?

1 Ответ

0 голосов
/ 02 октября 2018

Это можно сделать с помощью Оуина.В файле 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           
    }
}

К несчастью, Овин по умолчанию не поддерживает базовую аутентификацию, для этого вам нужно написать собственное промежуточное программное обеспечение:

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/

О том, как настроить jwt для owin, вы найдете более подробную информацию в Google.Без подробностей о вашем поставщике jwt я не могу помочь вам с настройкой.

Когда вы настраиваете jwt и базовую аутентификацию, вы просто добавляете атрибут [Authorize] к своим контроллерам или методам:

[Authorize]
public class AccountController : ApiController
{

}

Owin будетпроделайте остальную работу, чтобы определить, какой метод auth использовался для авторизации запроса.

Если вы не используете jwt в качестве токенов-носителей, используйте UseOAuthAuthorizationServer вместо UseOAuthBearerAuthentication.

Также с помощью Owin вы можете добавитьдругие поставщики, такие как Google, Microsoft, Facebook и другие.

...