Корреляция OID C не удалась в приложении MS Teams Blazor, но работает в браузере - PullRequest
0 голосов
/ 07 августа 2020

Я кодирую приложение Blazor (ASP. NET Core 3.1) для MS Teams. В приложении пользователь должен пройти аутентификацию через всплывающее окно аутентификации. Приложение размещается через внутренний IIS на локальном хосте и туннелируется через ngrok в MS Teams. В Blazor есть компоненты Blazor, которые сохраняются с помощью флага @attribute [Authorize], который описан в Blazor Security . Приложение правильно зарегистрировано на Azure AD Portal. Когда я пытаюсь выполнить аутентификацию через Azure AD в приложении, которое размещено в MS Teams, приложение считывает учетные данные пользователя и отправляет их на Azure. Я думаю, что при перенаправлении выдается Ошибка An unhandled exception occurred while processing the request. Exception: Correlation failed. Unknown location Exception: An error was encountered while handling the remote login. Microsoft.AspNetCore.Authentication.RemoteAuthenticationHandler<TOptions>.HandleRequestAsync(). Звонок выглядит так:

https://login.microsoftonline.com/[tenantid]/oauth2/authorize?client_id=[clientId]&redirect_uri=https%3A%2F%2Flocalhost%3A44302%2Fsignin-oidc&response_type=id_token&scope=openid%20profile&response_mode=form_post&nonce=[nonce]&state=[state]&x-client-SKU=ID_NETSTANDARD2_0&x-client-ver=5.5.0.0
Также не создан повар ie. Интересно то, что в браузере (Chrome) процесс аутентификации работает нормально, а также корректно создается cook ie. Также Blazor AuthentificationStateProvider правильно получает UserState из всплывающего окна. Моя страница входа в систему со всплывающим окном аутентификации:
function login() {
        $(".auth-data").hide();
        microsoftTeams.authentication.authenticate({
            url: window.location.origin + "/AzureAD/Account/SignIn",
            width: 600,
            height: 535,
            successCallback: function (result) {
                window.location.replace(window.location.origin + "/");
            },
            failureCallback: function (reason) {
                console.log("Login failed: " + reason);
                if (reason === "CancelledByUser" || reason === "FailedToOpenWindow") {
                    console.log("Login was blocked by popup blocker or canceled by user.");
                }
                // At this point we have to get the user involved, so show the login button
                $("#btnLogin").show();
                $(".auth-data").hide();
                $("#divError").text(reason).show();
            }
        });
    }

Моя стартовая страница:

private void CheckSameSite(HttpContext httpContext, CookieOptions options)
    {
        if (options.SameSite == SameSiteMode.None)
        {
            var userAgent = httpContext.Request.Headers["User-Agent"].ToString();
            // TODO: Use your User Agent library of choice here.
            if (userAgent.Contains("Chrome"))
            {
                options.SameSite = SameSiteMode.Unspecified;
            }
        }
    }

    public void ConfigureServices(IServiceCollection services)
    {
        services.Configure<CookiePolicyOptions>(options =>
        {
            options.MinimumSameSitePolicy = SameSiteMode.Unspecified;
            options.OnAppendCookie = cookieContext =>
                CheckSameSite(cookieContext.Context, cookieContext.CookieOptions);
            options.OnDeleteCookie = cookieContext =>
                CheckSameSite(cookieContext.Context, cookieContext.CookieOptions);
            options.HttpOnly = HttpOnlyPolicy.None;
            options.Secure = CookieSecurePolicy.Always;
        });

        services
            .AddAuthentication(AzureADDefaults.AuthenticationScheme)
            .AddAzureAD(options => Configuration.Bind("AzureAd", options));

        services.Configure<JwtBearerOptions>(
        AzureADDefaults.JwtBearerAuthenticationScheme, options =>
        {
            options.TokenValidationParameters.NameClaimType = "name";
        });

        services.AddRazorPages();
        services.AddServerSideBlazor();
        services.AddBlazoredLocalStorage();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        app.UseCookiePolicy();

        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();

        app.UseRouting();

        app.UseAuthentication();
        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
            endpoints.MapBlazorHub();
            endpoints.MapFallbackToPage("/_Host");
        });
    }

Как видите, я использовал метод, упомянутый в другом вопросе о переполнении стека. Переполнение стека это не работает для моей задачи. Мне может потребоваться помощь, если что-то неправильно настроено в моем автозагрузке или в другом месте, потому что аутентификация через Teams не работает для меня только через браузер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...