Файл cookie корреляции OpenIdConnect не найден, когда пользователь нажимает на ссылку из приложения Office - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть приложение, которое проходит проверку подлинности с помощью Azure Active Directory с использованием OpenIdConnect.Все работает нормально, за исключением случаев, когда я делаю ссылку на свой сайт из приложения Office (Excel / Word).Из этих приложений я получаю «Исключение: корреляция не удалась».

Из моего исследования кажется, что офис сначала выполняет перенаправление 302, а затем открывает эту страницу, а не исходную ссылку.

См .: https://github.com/aspnet/Security/issues/1252

После рекомендации о том, как справиться с этим сценарием.Я не хочу вносить много изменений в поток аутентификации и вносить ошибки.

Я пытался перенаправить на другую страницу на моем сайте, когда обнаружен пользовательский агент Excel.Я думал, что тогда будет установлен правильный файл cookie, и я мог бы перенаправить оттуда на запрошенную страницу, которая затем инициировала бы авторизацию.Не повезло, хотя

OnRedirectToIdentityProvider = context =>
{                   
     if (context.Request.Headers["User-Agent"].ToString().Contains("Microsoft Office Excel"))
     {

              string redirect = context.Request.Scheme + "://" + context.Request.Host + context.Request.PathBase + "/Home/Office" + "?url=" + context.Request.Scheme + "://" + context.Request.Host + context.Request.PathBase + context.Request.Path;
              context.Response.Clear();
              context.Response.Redirect(redirect);
              context.HandleResponse();
              return Task.CompletedTask;
    }
}

Ответы [ 2 ]

0 голосов
/ 19 марта 2019

В Startup.ConfigureServices () вам нужно добавить эту строку

services.Configure<CookiePolicyOptions>(options =>
    {
        // This lambda determines whether user consent for 
        //non -essential cookies is needed for a given request.
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });
0 голосов
/ 24 сентября 2018

Мне удалось реализовать достойное решение, используя промежуточное ПО owin.Во многом с помощью этого поста: https://github.com/aspnet/AspNetKatana/issues/78

Мне как-то нужно было конвертировать его в .net core 2.0.Вот преобразованный код:

public class MsOfficeLinkPrefetchMiddleware 
{
    RequestDelegate _next;

    public MsOfficeLinkPrefetchMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public Task Invoke(HttpContext context)
    {
        if (Is(context, HttpMethod.Get, HttpMethod.Head) && IsMsOffice(context))
        {
            // Mitigate by preempting auth challenges to MS Office apps' preflight requests and
            // let the real browser start at the original URL and handle all redirects and cookies.

            // Success response indicates to Office that the link is OK.
            context.Response.StatusCode = (int)HttpStatusCode.OK;
            context.Response.Headers["Cache-Control"] = "no-cache, no-store, must-revalidate";
            context.Response.Headers["Pragma"] = "no-cache";
            context.Response.Headers["Expires"] = "0";
        }
        else if (_next != null)
        {
            return _next.Invoke(context);
        }

        return Task.CompletedTask;
    }

    private static bool Is(HttpContext context, params HttpMethod[] methods)
    {
        var requestMethod = context.Request.Method;
        return methods.Any(method => StringComparer.OrdinalIgnoreCase.Equals(requestMethod, method.Method));
    }

    private static readonly Regex _msOfficeUserAgent = new Regex(
        @"(^Microsoft Office\b)|([\(;]\s*ms-office\s*[;\)])",
        RegexOptions.CultureInvariant | RegexOptions.IgnoreCase | RegexOptions.Singleline | RegexOptions.Compiled);

    private static bool IsMsOffice(HttpContext context)
    {
        var headers = context.Request.Headers;

        var userAgent = headers["User-Agent"];

        return _msOfficeUserAgent.IsMatch(userAgent)
            || !string.IsNullOrWhiteSpace(headers["X-Office-Major-Version"]);
    }
}

Запуск

app.UseMiddleware<MsOfficeLinkPrefetchMiddleware>();

Надеюсь, что это поможет кому-то в будущем.

...