我正在使用Windows身份验证创建Intranet站点。
也许我不是最好的方式,但是我试图通过调用一个包含Authorize action过滤器的控制器方法来加载部分视图,这样只有经过授权的人才能看到该部分的页面。比如说,我想在页面上加载管理员工具,但前提是登录的个人是管理员。
所以在index.cshtml页面上我可能有类似的东西:
@Html.Action("LoadAdminTools","ControllerName")
Controller将包含代码:
[Authorize(Roles="Admins")]
public ActionResult LoadAdminTools()
{
return PartialView("_AdminToolsPartialView");
}
然后,如果登录用户是 Admins 角色的一部分,那么包含管理控件(或其他)的部分视图将呈现给页面 - 仅。
我遇到的“问题”是,如果登录的人无权加载部分视图,浏览器会弹出登录对话框,询问用户的凭据。关闭对话框而不输入任何凭据会导致预期的结果 - 部分视图不会在页面的其余部分加载时加载。很酷,但很烦人。输入错误的凭据,您会收到401错误 - 也是预期的。
如果有帮助:在IIS中,匿名身份验证已禁用,Windows身份验证已启用 。 在“安全设置 - 本地Intranet区域”下的“Internet选项”中选择“使用当前用户名和密码自动登录”。
我的问题是:有没有办法在没有浏览器要求用户登录的情况下使用[授权]操作过滤器加载部分视图(或者真的做任何事情)?只需要获取当前登录的凭据,检查它们是否符合操作过滤器,如果有,则加载部分视图,如果没有,则不要。如果没有,是否有更好的方式来实现我想在这里完成的工作?
更新
美丽。我阅读了你发布的问题的解决方案,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");
}
现在它可以通过没有浏览器登录对话框加载页面 - 部分视图,当它是授权的用户时,< em>没有部分视图不是授权的用户=)
谢谢!
答案 0 :(得分:4)
不幸的是,ASP.NET(以及MVC)在可能的情况下混淆了授权和身份验证。
检查此问题以获得解决方案。