禁止使用[授权]操作过滤器的控制器方法的浏览器身份验证登录对话框



我正在使用Windows身份验证创建一个Intranet站点。

也许我不是最好的方法,但我正在尝试通过调用一个控制器方法来加载部分视图,该方法周围有一个授权操作过滤器,以便只有授权的个人才能看到页面的该部分。 例如,我想将管理员工具加载到页面上,但前提是登录的个人是管理员。

所以在index.cshtml页面上,我可能会有这样的东西:

@Html.Action("LoadAdminTools","ControllerName")

控制器将包含以下代码:

        [Authorize(Roles="Admins")]
        public ActionResult LoadAdminTools()
        {
            return PartialView("_AdminToolsPartialView");
        }

然后,包含管理员控件(或其他控件(的部分视图将呈现到页面 - 当登录用户是管理员角色的一部分时。

我遇到的"问题"是,如果登录者无权加载部分视图,浏览器会弹出登录对话框,询问用户的凭据。 关闭对话框而不输入任何凭据会导致预期的结果 - 部分视图不会加载,而页面的其余部分会加载。很酷,但很烦人。 输入不正确的凭据,您会收到 401 错误 - 也符合预期。

如果有帮助:在 IIS 中,禁用匿名身份验证,启用 Windows 身份验证。"使用当前用户名和密码自动登录"在"安全设置 - 本地 Intranet 区域"下的"Internet 选项"中选择。

我的问题是:有没有办法使用 [授权] 操作过滤器加载部分视图(或执行任何操作,实际上(,而无需浏览器要求用户登录? 只需让它获取当前登录凭据,检查它们是否符合操作过滤器,如果符合,则加载部分视图,如果不符合,则不要。 如果没有,是否有更好的方法来完成我想在这里完成的事情?

更新


美丽。我阅读了您发布的问题的解决方案,Mystere Man,在控制器的文件夹中创建了一个名为IntranetAuthorizeAttribute.cs的新类,并输入了代码:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
    public class IntranetAuthorizeAttribute : System.Web.Mvc.AuthorizeAttribute
    {        
        protected override void HandleUnauthorizedRequest(System.Web.Mvc.AuthorizationContext filterContext)
        {
            if (filterContext.HttpContext.Request.IsAuthenticated)
            {
                filterContext.Result = new System.Web.Mvc.HttpStatusCodeResult(403);
            }
            else
            {
                base.HandleUnauthorizedRequest(filterContext);
            }
        }        
    }

已将"授权"筛选器替换为我的新"内部网授权"筛选器:

        [IntranetAuthorize(Roles="Admins")]
        public ActionResult LoadAdminTools()
        {
            return PartialView("_AdminToolsPartialView");
        }

现在它加载页面很好,没有浏览器登录对话框 - 当它是授权用户时部分视图,当它不是授权用户时没有部分视图=(

谢谢!

不幸的是,ASP.NET(以及 MVC(在可能的情况下将授权和身份验证混为一谈。

检查此问题以获取解决方案。

为什么授权属性会重定向到身份验证和授权失败的登录页面?

最新更新