Следующее решение работает для меня: В вашем регистре вызова Startup
UseCookieAuthentication
, 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.
Полученная же проблема. Не могли бы вы найти решение? –