Получение волшебной ссылки для входа в Azure без двойного выхода - PullRequest
0 голосов
/ 01 мая 2018

Попытка реализовать регистрацию по магической ссылке в веб-приложении 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?

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Изменение параметров из строки запроса вместо маршрута, по-видимому, решает эту проблему при развертывании в Azure.

[HttpGet("/magic", Name = "MagicLinkRoute")]
public async Task<IActionResult> MagicLogin([FromQuery]string userid, [FromQuery]string token )
{
    // ...
0 голосов
/ 02 мая 2018

Для некоторых символов требуется дополнительная настройка в зависимости от среды размещения:

Чтобы разрешить '+' в именах элементов в 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>

Для более подробной информации, вы можете обратиться к этой статье и этой one .

...