当前位置: 首页 > 知识库问答 >
问题:

微软身份验证自动登录帐户。导致“关联失败”错误,当用户手动选择帐户

邹宏峻
2023-03-14

我们一直在利用Cookie认证。NET Core 2.2应用

Microsoft.AspNetCore.Authentication.MicrosoftAccount.MicrosoftAccountHandler:信息:远程身份验证错误:关联失败…"

我们已将其缩小到以下情况:如果用户已登录到其 Microsoft 帐户(只有一个帐户已登录/处于活动状态)...如果他们随后登录我们的网站,他们将自动登录,而无需选择他们的帐户名称或任何其他互动。更重要的是,如果用户确实单击其帐户名称,则会触发另一个登录请求

我能够从本地主机复制这个问题,尽管我们的实际托管提供商在Azure(应用服务)中。

我已经研究了以下Microsoft文档中提到的一些解决方案/方法,这些文档提到了负载平衡器和代理服务器的配置(转发头)...以及在ASP.NET核心区实施HTTPS:

https://docs . Microsoft . com/en-us/aspnet/core/host-and-deploy/proxy-load-balancer?view=aspnetcore-2.1

https://docs.microsoft.com/en-us/aspnet/core/security/enforcing-ssl?view=aspnetcore-2.1

这些似乎没有解决问题的根源,我认为这是在向Microsoft提供商提出安全挑战时自动登录/选择用户帐户的问题。

下面是来自我们的启动.cs服务配置的代码段,用于第三方身份验证配置

      // Authentication is added via Cookie
      services.ConfigureApplicationCookie(options => options.LoginPath = "/Login");
      services.AddAuthentication(opts =>
      {
        opts.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        opts.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
      })
      .AddCookie(opts =>
      {
        opts.Cookie.SecurePolicy = CookieSecurePolicy.Always;
        opts.LoginPath = "/auth/login";
        opts.LogoutPath = "/auth/logout";
        opts.ClaimsIssuer = "<ISSUER_HERE>"; // *** redacted for privacy
      })
      .AddMicrosoftAccount(options =>
      {
        options.ClientId = Configuration["Authentication:ApplicationId"];
        options.ClientSecret = Configuration["Authentication:Password"];
        options.Events.OnRemoteFailure = ctx =>
        {
          // React to the error here. See the notes below.
          ctx.Response.Redirect("/error?FailureMessage=" + UrlEncoder.Default.Encode(ctx.Failure.Message));
          ctx.HandleResponse();
          return Task.FromResult(0);
        };
      });

理想情况下,“自动登录”行为被阻止,因此用户必须从Microsoft帐户选择提示中选择他们的帐户(即使他们之前已经登录)。

目前,我们正在将用户重定向到错误页面,在那里我们可以清除所有cookie并让用户重新尝试登录。如果他们在登录过程中不断选择用户帐户,这会带来问题

任何见解将不胜感激!

共有1个答案

赵健柏
2023-03-14

好吧,我知道了。

这看起来有点老套,但嘿,它很管用。

 .AddMicrosoftAccount(options =>
 {
     // Your configuration here

     options.Events.OnRedirectToAuthorizationEndpoint = context =>
     {
         context.HttpContext.Response.Redirect(context.RedirectUri + "&prompt=select_account");
         return Task.FromResult(0);
     };   
 })
 类似资料:
  • 我有一个硒服务,必须登录到我的gmail帐户作为第一步。这个功能几周前还在工作,但突然登录开始失败,我在浏览器中看到这个错误,在硒Chrome和Firefox驱动程序中都尝试过- 此错误发生在selenium服务插入电子邮件、密码并单击登录按钮之后。谷歌支持论坛也报告了类似的错误:https://support.google.com/accounts/thread/10916318?hl=en他们

  • 在Android>Sample app>Trivial Drive中,当运行应用程序时,我在执行IAP时得到以下信息: 我在手机上用测试帐户(即我在开发人员控制台中指定的测试电子邮件地址)切换到了一个单独的帐户,并遵循了以下所有步骤: https://android.stackExchange.com/questions/20369/geting-authentication-is-require

  • 我的基本要求是公开一些REST资源的Web API。访问任何资源都需要身份验证,我希望这通过Microsoft帐户进行。这是一个用于编程访问的Web api。 我沿着这条路开始:https://docs.microsoft.com/en-us/aspnet/core/security/authentication/social/microsoft-logins?view=aspnetcore-2.

  • 我有一个API在Apache堆栈上运行,使用Java。我继承了一个遗留代码库,需要找到这个错误来自哪里显然是上一个开发人员构建了一个不能工作的特性,这就是错误所在,但没有更多信息。它使用Drupal webservice模块,发送调用的代码如下所示 我可以从哪里开始寻找这个错误,或者它可能意味着什么,你有什么想法吗? 完整的堆栈跟踪如下所示::: 用户失败:null。java.lang.Unsup

  • 我不知道我的代码或Firebase控制台有什么问题,但当我运行应用程序并单击提交按钮尝试创建一个帐户时,它会运行,我不知道为什么。 很抱歉对我的描述含糊不清,但如果有人能告诉我我做错了什么,我将非常感激。 } 错误消息

  • 将匿名帐户转换为永久帐户的文档指出了流程的3个步骤,但是步骤2似乎违反了步骤1。 当用户注册时,完成用户身份验证提供者的登录流程,直到(但不包括)调用其中一个身份验证提供者。用方法来表示。例如,获取用户的Google ID令牌、Facebook访问令牌或电子邮件地址和密码 获取新身份验证提供程序的身份验证凭据: