授权页面上的MVC Windows身份验证401

时间:2016-01-21 10:28:45

标签: c# asp.net-mvc security model-view-controller

我有一个MVC5网站,我希望任何人都可以在受限制的管理区域之外查看该网站。我创建了一个过滤器来检查我已应用于管理控制器的用户AD组,这非常正常。

问题是观看主站点的人,如果它闲置一段时间,他们在导航到页面时会收到未经授权的响应。一旦他们刷新了它的罚款并允许他们回到页面。

Web.Config在

中有以下内容
<authentication mode="Windows" />

如果我将其删除,则问题就会消失,但管理员控制器无法正常工作,因为我的自定义过滤器中找不到Windows用户。

自定义过滤器只检查AD组:

 var groupList = GetGroupList();

        if (base.AuthorizeCore(httpContext))
        {
            if (string.IsNullOrEmpty(groupList))
                return true;

            var groups = groupList.Split(',').ToList();

            var context = new PrincipalContext(ContextType.Domain, "MYDOMAIN");

            var userPrincipal = UserPrincipal.FindByIdentity(
                context,
                IdentityType.SamAccountName,
                httpContext.User.Identity.Name);

            if (userPrincipal == null)
                return false;

            try
            {
                foreach (var group in groups)
                    if (userPrincipal.IsMemberOf(context,
                         IdentityType.Name,
                         group))
                        return true;
            }
            catch
            {
                return false;
            }

2 个答案:

答案 0 :(得分:0)

我认为您希望在未经授权的访问时将用户重定向到某个错误页面。   您可以通过在Web配置中添加此项来完成此操作。 (AccessDenied.aspx页面是您为Un Authorized user access编写消息的地方)

      <customErrors defaultRedirect="ErrorPage.aspx" mode="On"> 
     <error statusCode="401" redirect="AccessDenied.aspx" />       
   </customErrors>

或者您可以在Global.asax文件中执行此操作

     protected void Application_AuthenticateRequest(Object sender, 
                                                EventArgs e)
        {
      if (!Request.IsAuthenticated) Response.Redirect(
                                        "AccessDenied.aspx"); 
     }

答案 1 :(得分:0)

在我最近的经验中,从IIS框中使用AD,我使用相同的过滤器来按AD组过滤。虽然我的过滤器是相同的,但我注意到httpContext.User.Identity.Name不会像控制器中的“普通”匿名网站那样返回用户。

为了让它通过AD用户sans登录屏幕进行自动授权,我必须禁用匿名身份验证,启用Windows身份验证,设置<identity impersonate="true" />并使用:

 UserPrincipal adUser = null;
        using (HostingEnvironment.Impersonate())
        {
            var userContext = System.Web.HttpContext.Current.User.Identity;
            PrincipalContext ctx = new PrincipalContext(ContextType.Domain, ConfigurationManager.AppSettings["AllowedDomain"], null,
                ContextOptions.Negotiate | ContextOptions.SecureSocketLayer);
            adUser = UserPrincipal.FindByIdentity(ctx, userContext.Name);
        }
// and work with 'adUser' from here on in my controllers...

我的应用程序现在正在内部投入生产,但我没有遇到你的psuedo'超时'问题。你的web.config中是否有任何无关的表格auth标签?

我还必须在我的web.config中设置<sessionState mode="InProc" />