Переопределить URL-адрес перенаправления в удостоверении AddMicrosoftAccount() OAuth для веб-приложения ASP.NET Core
У меня есть сайт, развернутый в Azure. Я использовал Cloudflare для CNAME домена azurewebsites и поэтому установил 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"];
});
У кого-нибудь есть предложения? Чтобы усложнить ситуацию, у меня есть эта структура:
- Cloudflare
- Лазурный CDN
- Веб-приложение Azure
2 ответа
Вы можете дважды проверить ожидаемый URL перенаправления, проверив URL ответа AAD приложения с инструкциями здесь. Это должно точно соответствовать тому, что вы отправляете в своем запросе. Если для распространения обновлений может потребоваться несколько минут, подождите некоторое время после обновления этого параметра, чтобы устранить ошибки.
Мне удалось переопределить 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);
};
});
Проблема связана с конфликтом между выравниванием CNAME CloudFlare и Azure CNAME verification
, Сглаживание CNAME, по сути, возвращает записи A, что ускоряет разрешение DNS и является хорошей идеей в целом. Однако проверка CNAME Azure проверяет только записи CNAME.
Лучший обходной путь, который я нашел, это:
1. Отключить HTTP-прокси CloudFlare (щелкните оранжевое облако на этой записи CNAME, чтобы оно стало серым); это также отключает выравнивание CNAME для этой записи.
2. Проверяйте хост на dig, пока не увидите записи CNAME.
3. Проверьте свой хост CNAME на портале Azure.
4.Вновь включите HTTP-прокси CloudFlare (щелкните на сером облаке на этой записи CNAME, чтобы он стал оранжевым).
Это позволяет проверять Azure и при этом использовать преимущества CDN CloudFlare.
Для более подробной информации, вы можете обратиться к этой статье.