【问题标题】:Image Resizer User.Identity in eventhandler事件处理程序中的图像调整器 User.Identity
【发布时间】:2012-07-30 22:23:17
【问题描述】:

为图像访问限制添加了 AuthorizeImage 事件处理程序。当我尝试检查用户名和身份验证状态时注意到以下内容:

下面不会导致异常,但似乎会破坏它。无论是否经过身份验证,都会显示未找到图像的默认图标。 测试了 this.User = 相同的结果。 HttpContext.Current.User = 相同的结果

Config.Current.Pipeline.AuthorizeImage += delegate(IHttpModule sender, HttpContext context, IUrlAuthorizationEventArgs e)
{
    if (context.User.Identity.IsAuthenticated) { context.Response.Redirect("http://db2.stb00.s-msn.com/i/AF/263B63C5E656379CEE93E7A8692EC7.gif"); }    
};

以下工作正常(this.User 和 HttpCONtext.Current.User 也是如此)

Config.Current.Pipeline.AuthorizeImage += delegate(IHttpModule sender, HttpContext context, IUrlAuthorizationEventArgs e)
{
    context.Response.Redirect("http://db2.stb00.s-msn.com/i/AF/263B63C5E656379CEE93E7A8692EC7.gif"); 
};

这总是重定向

Config.Current.Pipeline.AuthorizeImage += delegate(IHttpModule sender, HttpContext context, IUrlAuthorizationEventArgs e)
{
    if (context.User == null)
        context.Response.Redirect("http://db2.stb00.s-msn.com/i/AF/263B63C5E656379CEE93E7A8692EC7.gif");
};

我开始在 Application_Start 中进行测试,但实际上也尝试了 Application_PostAuthenticateRequest。虽然结果哪里一样。我通过自定义代码进行身份验证,但使用标准格式验证来设置 cookie。 [Authorize] 在应用程序中工作正常。对这里可能出了什么问题有什么建议吗?

【问题讨论】:

  • 请,如果您收到图像的“未找到”图标,请直接打开 URL 并获取实际的错误消息。
  • 抱歉应该加上这个。我只得到空引用异常,“对象引用未设置为对象的实例。”标记包含“if (context.User.Identity.IsAuthenticated) { context.Response.Redirect("db2.stb00.s-msn.com/i/AF/…); }”。所以 context.User 似乎没有被实例化。问题是为什么。由于身份验证在其他方面起作用(并且视图中的 @User.Identity.Name 给了我用户名)我怀疑与事件处理程序相关的东西?
  • ASP.NET 不会为匿名用户填充 context.User。如果您不是匿名的,那么您的代码不会在 PostAuthorize 之前加载用户,这是一个错误。
  • " 那么您的代码在 PostAuthorize 之前没有加载用户" 有点可惜,因为我使用标准表单身份验证。我唯一的formsauth行实际上是“FormsAuthentication.SetAuthCookie(UserName, RememberMe);”在这个阶段。
  • 我搜索了一下,看到了关于 IIS7 中的更改和集成应用程序在 global.asax 问题方面的讨论。无论如何,它给了我切换网络服务器的想法。我坐在 VS 2012 RC 上,所以我从 iis express 切换到 Visual Studio Dev Server,现在它工作正常。有点奇怪。

标签: asp.net-mvc-4 imageresizer


【解决方案1】:

您的服务器配置为仅针对某些请求扩展名(例如 .aspx、.ashx 等)运行 FormsAuthenticationModule。有两种方法可以解决此问题。

  1. 删除并重新添加 <system.webServer> <modules> 中的 FormsAuthenticationModule(对于集成模式),删除 precondition="managedHandler" 属性:
  2. 启用 RAMMFAR (runAllManagedModulesForAllRequests)

这篇文章包含有关实施 #1 和 #2 的更多详细信息:

How do I protect static files with ASP.NET form authentication on IIS 7.5?

【讨论】:

  • 解决方案 1 是可行的方法,如果可能的话。请参阅SCOTT HANSELMAN's blog post 了解有关 RAMMFAR 的更多信息,以及为什么要避免它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多