响应在此上下文Global.asax中不可用

时间:2015-02-25 13:08:24

标签: c# asp.net-mvc global-asax

我正在检查用户是否已经在global.asax中被授权,如果为true则重定向到某个路径

if (false)
{
    HttpContext.Current.Response.RedirectToRoute("Login");
}

它抛出了异常:

  

在此上下文中无法获得响应

2 个答案:

答案 0 :(得分:3)

我认为使用web.config中的authentication tag是一个更好的解决方案。

// or loginUrl="~/Account/LogOn" for example in an MVC application
<authentication mode="Windows">
   <forms 
      name=".ASPXAUTH" 
      loginUrl="login.aspx"       
      defaultUrl="default.aspx" 
      protection="All" 
      timeout="30" 
      path="/" 
      requireSSL="false" 
      slidingExpiration="true" 
      cookieless="UseDeviceProfile" domain="" 
      enableCrossAppRedirects="false">
      <credentials passwordFormat="SHA1" />
   </forms>
   <passport redirectUrl="internal" />
</authentication>

您可以定义 loginUrl ,如果用户尝试访问需要身份验证的资源,用户将被重定向。

<强>更新

根据您给出的评论,我认为您可能正在寻找基于授权的路由。在 SO问题 MVC role-based routing中已经有了答案。

答案 1 :(得分:0)

据我所知,ASP.NET与HttpContextHttpRequest对象一起创建HttpResponse个对象。它在创建HttpApplication实例之前发生。

所以HttpContext.Current似乎在这个阶段不起作用。

在应用程序事件的内部处理程序中,您可以获取上下文抛出sender

private void OnAuthorizeRequest(object sender, EventArgs e)
{
    var application = (HttpApplication)sender;
    var context = (HttpContext)application.Context;
}

AuthorizeRequest是重定向匿名用户的正确位置,因为之前的AuthenticateRequest 已经过身份验证尚未对用户进行身份验证。 )

详见here

重要的是:邻居答案绝对正确,您应该使用web.config来制作此内容。我的回答是“它是如何工作的”,以及“它是如何完成的”。