2016-07-14 1 views
2

Я добавил службу веб-API к проекту 'legacy' MVC (а не vNext), все еще используя членство и модуль проверки подлинности форм. Все в порядке, пока я не решил сделать веб-приложение api мобильным сервисом, используя последние SDK для Azure App Services for Mobile.Azure App Service Мобильная аутентификация несовместима с MVC/Forms

Я до сих пор сузил проблему к этому

//app.UseAppServiceAuthentication(new AppServiceAuthenticationOptions() 
      //{ 

      // SigningKey = CloudConfigurationManager.GetSetting("authSigningKey"), 
      // ValidAudiences = new[] { CloudConfigurationManager.GetSetting("authAudience") }, 
      // ValidIssuers = new[] { CloudConfigurationManager.GetSetting("authIssuer") }, 
      // TokenHandler = GlobalConfiguration.Configuration.GetAppServiceTokenHandler() 
      //}); 

Это изменяет остальную часть приложения, так что MVC + форма аутентификация не работает. Запуск времени для исследования проблемы. Любые подсказки ??

+0

Полученная же проблема. Не могли бы вы найти решение? –

ответ

1

Следующее решение работает для меня: В вашем регистре вызова StartupUseCookieAuthentication, UseExternalSignInCookie или UseOAuthAuthorizationServerперед тем вызова UseAppServiceAuthentication.

Второй шаг: Добавьте следующий класс в проект:

private sealed class CustomAppServiceAuthenticationMiddleware : AppServiceAuthenticationMiddleware 
{ 
    private readonly ILogger _logger; 

    public CustomAppServiceAuthenticationMiddleware(OwinMiddleware next, IAppBuilder appBuilder, AppServiceAuthenticationOptions options) : base(next, appBuilder, options) 
    { 
     _logger = (ILogger)GetType().BaseType.GetField("logger", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(this); 
    } 

    protected override AuthenticationHandler<AppServiceAuthenticationOptions> CreateHandler() 
    { 
     return new AppServiceAuthenticationHandler(_logger); 
    } 

    public override Task Invoke(IOwinContext context) 
    { 
     string logLine = $"AppServiceAuthMiddleware: {context.Request.Path}"; 

     if (context.Request.Headers.TryGetValue("Authorization", out var values)) 
      logLine += $"; Authorization: {values.First().Split(' ').FirstOrDefault()}"; 
     if (context.Request.Headers.TryGetValue("X-ZUMO-AUTH", out values)) 
      logLine += $"; X-ZUMO-AUTH: {values.First()}"; 

     _logger.WriteVerbose(logLine); 
     Debug.WriteLine(logLine); 

     if (IsZumoAuth(context)) 
     { 
      return base.Invoke(context); 
     } 

     return Next.Invoke(context); 
    } 

    private bool IsZumoAuth(IOwinContext context) 
    { 
     return context.Request.Headers.ContainsKey("X-ZUMO-AUTH"); 
    } 
} 

Thrid шаг: Заменить app.UseAppServiceAuthentication следующим:

 app.Use(typeof(CustomAppServiceAuthenticationMiddleware), app, new AppServiceAuthenticationOptions 
     { 
      SigningKey = ..., 
      ValidAudiences = ..., 
      ValidIssuers = ..., 
      TokenHandler = ... 
     }); 

Это будет ли Owin pipline сделать называть AppServiceAuthenticationMiddleware только для авторизации ZUMO-AUTH.

У меня есть смешанная сеть & мобильное приложение. При таком подходе работает аутентификация членства в веб-приложении. В приложении работают некоторые пользовательские oauth (обновить токены), а также лазурный auth (facebook, google, ...). Все это в том же приложении asp.net.

+0

Это потрясающе. – Sentinel