Попытка реализовать логин по магической ссылке в веб-приложении Asp.net core 2.1. Работает как чудо локально, однако при развертывании в Azure я получаю сообщение об ошибке: «Запрос содержит двойную escape-последовательность, а фильтрация запросов настроена на веб-сервере для запрета двойных escape-последовательностей.
MagicLinkSender.cs
var token = await _userManager.GenerateUserTokenAsync(
user: user,
tokenProvider: "MagicLinkTokenProvider",
purpose: "magic-link"
);
var magiclink = _urlHelper.Link(
routeName: "MagicLinkRoute",
values: new { userid = user.Id, token = token, });
AccountController
[HttpGet("/magic/{userid}/{token}", Name = "MagicLinkRoute")]
public async Task<IActionResult> MagicLogin([FromRoute]string userid, [FromRoute]string token )
{
// Sign the user out if they're signed in
if (_signInManager.IsSignedIn(User))
{
await _signInManager.SignOutAsync();
}
var user = await _signInManager.UserManager.FindByIdAsync(userid);
if (user != null)
{
token = token.Replace("%2F", "/");
var isValid = await _signInManager.UserManager.VerifyUserTokenAsync(
user: user,
tokenProvider: "MagicLinkTokenProvider",
purpose: "magic-link",
token: token
);
if (isValid)
{
await _signInManager.UserManager.UpdateSecurityStampAsync(user);
await _signInManager.SignInAsync(user, isPersistent: true);
}
}
return RedirectToPage("/Profile/Index");
}
Похоже, я могу обойти это, разрешив двойное экранирование в web.config:
<system.webServer>
<security>
<requestFiltering allowDoubleEscaping = "true" />
</security>
</system.webServer>
Однако это, похоже, открывает некоторый дыры в безопасности. Есть ли лучшие альтернативы, чтобы заставить это работать в Azure?
Некоторые символы требуют дополнительной настройки в зависимости от среды вашего хостинга:
Чтобы разрешить "+" в именах элементов в ASP.NET 2.0 и 4.0, установите конфигурацию \ в файле web.config.
<system.webServer>
<security>
<requestFiltering allowDoubleEscaping = "true" />
</security>
</system.webServer>
Чтобы разрешить '&' и '%' в ASP.NET 4.0, установите конфигурацию в файле web.config.
<system.web>
<httpRuntime requestPathInvalidCharacters = ""/>
</system.web>
Чтобы разрешить завершающие точки ('.') В ASP.NET 4.0, задайте конфигурацию в файле web.config.
<system.web>
<httpRuntime relaxedUrlToFileSystemMapping = "true"/>
</system.web>
Для получения дополнительной информации вы можете обратиться к этому статья и этому один.
Изменение использования параметров из строки запроса вместо маршрута, похоже, решает эту проблему при развертывании в Azure.
[HttpGet("/magic", Name = "MagicLinkRoute")]
public async Task<IActionResult> MagicLogin([FromQuery]string userid, [FromQuery]string token )
{
// ...
Обратите внимание, что это основной вопрос asp.net.