登录后,重定向到https://site/favicon.ico

时间:2014-12-15 15:14:22

标签: asp.net asp.net-mvc

我的ASP.NET应用程序发生了一些非常奇怪的事情,我创建了一个登录门户,每当登录完成时,大约75%的时间我被重定向到favicon.ico。

例如,以下是我登录的登录页面:

enter image description here

然后在我输入我的电子邮件和密码后,我不知怎的最终到了这里:

enter image description here

ReturnUrl在登录后用作重定向,%2f是正斜杠,它应该将用户设置为默认值。相反它以某种方式结束于favicon.ico。

我真的不明白这一点,特别是因为它不会一直发生。我确实看到了Firefox,Chrome和IE11的行为。如果没有发生,我会登陆https://172.16.0.20,默认。

以下是我在控制器中路由的方式:

[HttpPost]
public ActionResult Login(Models.LoginViewModel login)
{
    User u = null;
    if (ModelState.IsValid)
    {
        if (authProvider.Authenticate(login.Email, login.Password, login.RememberMe, out u))
        {
            return Redirect((TempData["ReturnUrl"] == null) ? Url.Action("Index", "Home") : (string)TempData["ReturnUrl"]);
        }
        else
        {
            ModelState.AddModelError("", "Incorrect username or password");
            return View();
        }
    }
    else
    {
        return View();
    }
}

这是我唯一的路线:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}

编辑:根据建议使用Fiddler,它似乎在某些时候尝试获取favicon.ico并且服务器响应其位置,更改ReturnUrl:

GET http://172.16.0.20/favicon.ico HTTP/1.1
Host: 172.16.0.20
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Cookie: ASP.NET_SessionId=gp1osbxvm5uawvfmsu3is5db
Connection: keep-alive


HTTP/1.1 302 Found
Location: /Account/Login?ReturnUrl=%2ffavicon.ico
Server: Microsoft-IIS/8.5
X-Powered-By: ASP.NET
Date: Mon, 15 Dec 2014 15:51:29 GMT
Content-Length: 156

处理此问题的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

调用favicon.ico的原因是因为这是标准的缩略图图像网址。浏览器使用图像数据填充chrome选项卡左侧的小网站徽标(其他浏览器可能会将徽标放在其他位置)。

此外,如果您没有指定针对移动设备优化的徽标,那么当您将网页保存到iOS主屏幕(也可能是Android)时,他们会使用favicon.ico作为图标。此外,不同的浏览器对刷新文件的频率有不同的规则,因此您无法预测何时会被请求,并且所有主要浏览器都会检查它。

你应该解决这个问题。也就是说,如果您的代码将最后请求的网址粘贴到TempData["ReturnUrl"]中,如果用户碰巧也会从

等标记请求任何图片,那么您也会遇到问题
<img src="/someOtherReturnUrl.jpg" />

因此,一个解决方案是将填充TempData [&#34; ReturnUrl&#34;]的位置更改为仅存储为服务页面而不是静态文件的sa Controller 。有一些方法可以在HttpModuleActionFilter中检查这可能是您正在使用的内容。

或者,这可能更简单,将代码更改为:

if (authProvider.Authenticate(login.Email, login.Password, login.RememberMe, out u))
{
    return Redirect((!string.IsNullOrEmpty(Request.QueryString["ReturnUrl"])) 
        ? Request.QueryString["ReturnUrl"]
        : Url.Action("Index", "Home");
}

因为您的登录页面看起来像url模式:/account/login?ReturnUrl=SomeUrl并且查询字符串比之前的请求更加一致。说真的,在网上你无法保证请求订单。 (或者至少它通常是一个坏主意,因为用户和浏览器会做各种古怪和有创造性的事情)。