我有一个部署到Azure的网站。为了CNAME azurewebsites域名,我使用了Cloudflare,因此将重定向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时,我有这些设置,但我找不到覆盖redirect-url:
services.AddAuthentication().AddMicrosoftAccount(microsoftOptions =>
{
microsoftOptions.ClientId = Configuration["Authentication:Microsoft:ApplicationId"];
microsoftOptions.ClientSecret = Configuration["Authentication:Microsoft:Password"];
});
有没有人有什么建议?为了使问题复杂化,我有这样的结构:
您可以通过使用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);
};
});
问题是由于CloudFlare's CNAME flattening和Azure的CNAME verification
之间的冲突。 CNAME展平实质上返回A记录,这加快了DNS分辨率,一般来说是个好主意。但是,Azure的CNAME验证仅验证CNAME记录。
我发现最好的解决方法是:
1.Disable CloudFlare的HTTP代理(单击该CNAME记录上的橙色云,使其变为灰色);这也会禁用该记录的CNAME展平。
2.在挖掘中检查您的主机,直到您看到CNAME记录显示为止。
3.在Azure门户上验证您的CNAME主机。
4.重新启用CloudFlare的HTTP代理(单击该CNAME记录上的灰色云,使其变为橙色)。
这允许您在Azure上进行验证,并仍然可以利用CloudFlare的CDN。
有关更多详细信息,请参阅此article。