【问题标题】:Response is not Available in this context Global.asax响应在此上下文中不可用 Global.asax
【发布时间】:2015-04-27 11:53:42
【问题描述】:

我正在检查用户是否已在 global.asax 中获得授权,如果为真则重定向到某个路由

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

它抛出异常:

响应在此上下文中不可用

【问题讨论】:

  • 您应该使用自定义操作过滤器
  • 你不应该在global.asax做任何路由,你想达到什么目的?
  • @CallumLinington 我有角色,当具有特定角色的用户(已授权)向我的服务器请求路由到正确的控制器和操作时
  • 您应该考虑创建授权过滤器,而不是在 global.asax 中编写任何内容。
  • @AkashKava 而不是自己创建,您应该从 AuthorizeAttribute 继承并覆盖适当的方法。

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


【解决方案1】:

据我所知,ASP.NET 创建了HttpContext 对象以及HttpRequestHttpResponse 对象。它发生在创建 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来做这个东西。我的回答是关于“它是如何工作的”和“它是如何完成的”。

【讨论】:

    【解决方案2】:

    我认为在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 Question MVC role-based routing已经有答案了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-30
      • 1970-01-01
      • 1970-01-01
      • 2013-12-29
      • 2016-09-08
      • 2013-01-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多