我的ASP.NET应用程序发生了一些非常奇怪的事情,我创建了一个登录门户,每当登录完成时,大约75%的时间我被重定向到favicon.ico。
例如,以下是我登录的登录页面:
然后在我输入我的电子邮件和密码后,我不知怎的最终到了这里:
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
处理此问题的正确方法是什么?
答案 0 :(得分:1)
调用favicon.ico
的原因是因为这是标准的缩略图图像网址。浏览器使用图像数据填充chrome选项卡左侧的小网站徽标(其他浏览器可能会将徽标放在其他位置)。
此外,如果您没有指定针对移动设备优化的徽标,那么当您将网页保存到iOS主屏幕(也可能是Android)时,他们会使用favicon.ico
作为图标。此外,不同的浏览器对刷新文件的频率有不同的规则,因此您无法预测何时会被请求,并且所有主要浏览器都会检查它。
你应该解决这个问题。也就是说,如果您的代码将最后请求的网址粘贴到TempData["ReturnUrl"]
中,如果用户碰巧也会从
<img src="/someOtherReturnUrl.jpg" />
因此,一个解决方案是将填充TempData [&#34; ReturnUrl&#34;]的位置更改为仅存储为服务页面而不是静态文件的sa Controller
。有一些方法可以在HttpModule
或ActionFilter
中检查这可能是您正在使用的内容。
或者,这可能更简单,将代码更改为:
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
并且查询字符串比之前的请求更加一致。说真的,在网上你无法保证请求订单。 (或者至少它通常是一个坏主意,因为用户和浏览器会做各种古怪和有创造性的事情)。