首页 > 解决方案 > 在 Azure 上接收神奇的登录链接而不允许双重转义

问题描述

尝试在 Asp.net core 2.1 Web 应用程序上实现魔术链接登录。在本地工作就像一个魅力,但是当部署到 Azure 时,我收到一条错误消息:`请求包含双转义序列并且请求过滤在 Web 服务器上配置为拒绝双转义序列

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,  });

帐户控制器

[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 中允许 doublescaping 来解决这个问题:

<system.webServer>
    <security>
        <requestFiltering allowDoubleEscaping="true" />
    </security>
</system.webServer>

然而,这似乎打开了一些安全漏洞。是否有更好的选择可以在 Azure 上运行?

标签: asp.netazureasp.net-coreazure-web-app-service

解决方案


根据您的托管环境,某些字符需要额外配置:

要在 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>

有关更多详细信息,您可以参考这篇文章和这篇文章。


推荐阅读