我正在使用 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");
}
现在它可以很好地加载页面,没有浏览器登录对话框 -当它是授权用户时使用部分视图,当它不是授权用户时没有部分视图=)
谢谢!