在ASP.NET Core Web应用程序的AddMicrosoftAccount()身份OAuth中覆盖重定向URL

时间:2019-02-15 10:11:08

标签: azure asp.net-core-mvc azure-web-sites cloudflare azure-cdn

我有一个部署到Azure的网站。我使用Cloudflare来为Azurewebsites域设置CNAME,因此将重定向URL设置为Cloudflare托管的域名为:

https://www.example.com/signin-microsoft

尝试登录时,我失败了,Microsoft提供的链接是:

https://login.live.com/err.srf?lc=1033#error=invalid_request&error_description=The+provided+value+for+the+input+parameter+'redirect_uri'+is+not+valid.+The+expected+value+is+'https://login.live.com/oauth20_desktop.srf'+or+a+URL+which+matches+the+redirect+URI+registered+for+this+client+application.&state=xxx

运行Fiddler时,我可以看到我的应用程序通过的重定向URL不是https://www.example.com,而是以下内容:

/common/oauth2/v2.0/authorize?client_id=f0caa31c-3117-4479-a284-65f5a38ff5b6&scope=https%3A%2F%2Fgraph.microsoft.com%2Fuser.read&response_type=code&redirect_uri=https%3A%2F%2Fexample.azurewebsites.net%2Fsignin-microsoft

在我的应用中设置Microsoft OAuth时,我具有以下设置,但找不到用于覆盖重定向URL的设置:

services.AddAuthentication().AddMicrosoftAccount(microsoftOptions =>
{
    microsoftOptions.ClientId = Configuration["Authentication:Microsoft:ApplicationId"];
    microsoftOptions.ClientSecret = Configuration["Authentication:Microsoft:Password"];
});

有人有什么建议吗?为了使事情复杂化,我具有以下结构:

  • Cloudflare
  • Azure CDN
  • Azure Web应用程序

2 个答案:

答案 0 :(得分:1)

您可以通过使用instructions here检查应用程序AAD答复URL来仔细检查重定向URL是否正确。这必须与您在请求中发送的内容完全匹配。如果要花费几分钟才能传播更新,请在更新此设置后花一些时间来解决错误。

我能够使用与answer in this question类似的策略来覆盖重定向uri。

        .AddMicrosoftAccount(microsoftOptions =>
        {
            microsoftOptions.ClientId = Configuration["AzureAd:AppId"];
            microsoftOptions.ClientSecret = Configuration["AzureAd:Password"];
            microsoftOptions.AuthorizationEndpoint = Configuration["AzureAd:AuthEndpoint"];
            microsoftOptions.CallbackPath = "/signin-oidc";
            microsoftOptions.Events.OnRedirectToAuthorizationEndpoint = context =>
            {
                context.Response.Redirect(Regex.Replace(context.RedirectUri, "redirect_uri=(.)+%2Fsignin-oidc", "redirect_uri=https%3A%2F%2Fwww.yourcustomdomain.com%2Fsignin-oidc"));

                return Task.FromResult(0);
            };
        });

答案 1 :(得分:0)

问题是由于CloudFlare's CNAME flattening与Azure的CNAME verification之间存在冲突。 CNAME展平实质上返回A记录,这可以加快DNS解析速度,并且通常是个好主意。但是,Azure的CNAME验证仅验证CNAME记录。

我发现最好的解决方法是:

1。禁用CloudFlare的HTTP代理(单击该CNAME记录上的橙色云,使其变为灰色);这也会禁用该记录的CNAME拼合。

2。在挖掘时检查主机,直到看到CNAME记录显示。

3。在Azure门户上验证您的CNAME主机。

4。重新启用CloudFlare的HTTP代理(单击该CNAME记录上的灰色云,使其变为橙色)。

这使您可以在Azure上进行验证,并且仍然利用CloudFlare的CDN。

有关更多详细信息,您可以参考此article