ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c#-Microsoft身份验证自动登录帐户.用户手动选择帐户时导致“关联失败”错误

2019-12-10 23:05:48  阅读:521  来源: 互联网

标签:authentication security c


我们一直在.NET Core 2.2应用程序&中使用Cookie身份验证.通过Microsoft外部第三方提供商验证其身份后登录用户.就在最近,我们发现此工作流程中存在一个错误,指出:

Microsoft.AspNetCore.Authentication.MicrosoftAccount.MicrosoftAccountHandler:Information: Error from RemoteAuthentication: Correlation failed..”

我们将其范围缩小到以下情况:如果用户已经登录到其Microsoft帐户(只有一个帐户已登录/处于活动状态)…,然后他们登录到我们的网站,则无需登录即可自动登录选择他们的帐户名称或任何其他互动方式.此外,如果用户点击其帐户名,则会触发另一个登录请求,我相信由于请求/响应Cookie发生冲突,导致出现“ Correlation failed ..”错误.

尽管我们的实际托管提供程序位于Azure(App Services)中,但我可以从localhost重现该问题.

我已经研究了以下Microsoft文档中提到的一些解决方案/方法,其中提到了负载平衡器和代理服务器(转发标头)的配置…以及在ASP.NET Core中实施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&tabs=visual-studio

这些似乎没有解决问题的根源,据我了解,这是对Microsoft提供程序进行安全性质询时用户帐户的自动登录/选择.

这是我们的Startup.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,并让用户重新尝试登录.如果他们在登录过程中不断选择他们的用户帐户,就会出现问题.两个请求都冲突.

任何见解将不胜感激!

解决方法:

好吧,我知道了.

似乎有点骇人听闻,但嘿,它可行.

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

     options.Events.OnRedirectToAuthorizationEndpoint = context =>
     {
         context.HttpContext.Response.Redirect(context.RedirectUri + "&prompt=select_account");
         return Task.FromResult(0);
     };   
 })

标签:authentication,security,c
来源: https://codeday.me/bug/20191210/2104948.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有