7

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

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

所以在 index.cshtml 页面上,我可能会有类似的内容:

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

控制器将包含以下代码:

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

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

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

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

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

更新


美丽的。我阅读了您发布的问题的解决方案,Mystere Man,在 Controller 的文件夹中创建了一个名为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 过滤器替换了 Authorize 过滤器:

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

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

谢谢!

4

1 回答 1

4

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

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

为什么AuthorizeAttribute会重定向到登录页面进行认证和授权失败?

于 2012-05-02T21:29:17.883 回答