【问题标题】:MVC3: Session_Start Fires twice when testing for RolesMVC3:Session_Start 在测试角色时触发两次
【发布时间】:2014-03-21 02:38:26
【问题描述】:

我需要使用 MVC3 对 Web 应用程序进行一些身份验证。客户希望有一个通用页面来显示他们是否在 Windows AD 中没有任何允许使用该应用程序的角色组。我找到了一种非常简单的方法来做到这一点,但只是好奇它是否是一种有效的方法,或者是否有更好的方法。

基本上在全局的 Session_Start 中,我正在检查 User.IsInRole(),如果返回 false,则执行 Response.Redirect()。这个问题是:在 IF 语句中的代码并点击 Response.Redirect() 代码之后,它会再次点击会话,然后再转到应用程序根目录中的 AccessDenied 页面。这个可以吗?如果它们是有效的并且不输入如果做response.redirect,它会导致任何问题吗?

        //if (!User.IsInRole("test_user"))
        //{
        //    Response.Redirect("~/AccessDenied.aspx", true);
        //}

【问题讨论】:

  • 你用过“~/Scripts/jquery.unobtrusive-ajax.min.js”吗?
  • Golda - 我试过了,但它仍然两次点击 Session_Start 函数 - 然后重定向到 AccessDenied.aspx 页面。
  • Golda - 这是我添加到 .Layout.cshtml 文件中的代码:@Scripts.Render("~/Scripts/jquery.unobtrusive-ajax.js")
  • 检查它是否在你的应用程序中声明了两次。

标签: asp.net-mvc asp.net-mvc-3 model-view-controller


【解决方案1】:

我建议您为 MVC3 编写授权过滤器并在那里执行此类逻辑:

public class RoleFilter: AuthorizeAttribute
{     
    public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext filterContext)
    {
        if (!User.IsInRole("test_user"))
        {
            filterContext.HttpContext.Response.StatusCode = 302;
            filterContext.Result = new RedirectResult("~/AcessDenied.aspx");
        }
    }
}

另外,我不建议您使用Response.Redirect,因为它会中止当前线程。

【讨论】:

  • 然后我将只使用 [RoleFilter] 然后我可以在我希望它触发的函数顶部使用 RoleFiler?无论 Session_Start 中的什么内容,我都需要一些代码来运行,但是如果他们在应用程序中没有根据他们的角色获得授权,我想将它们发送到该页面。
  • 它是如何知道FilterContext的?
  • 您可以在需要授权检查的控制器上添加 [RoleFilter]。
  • Oleksii Aza - 有没有一种方法可以让每个人都可以访问它,即使他们没有我允许应用程序的角色或我需要做什么那个?
  • 在Session_Start中运行需要什么代码?是否与授权检查有关?
猜你喜欢
  • 2011-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-02
  • 2010-09-29
  • 2022-01-08
  • 1970-01-01
相关资源
最近更新 更多