由Active Directory组控制的ASP.NET MVC 5页面

时间:2017-08-04 10:16:46

标签: asp.net asp.net-mvc active-directory

是否可以创建由Active Directory组严格控制的页面(View)?

此页面没有登录信息,如果您是“VIP”Active Directory组的成员,则会呈现该页面,否则您将无法查看该页面。

1 个答案:

答案 0 :(得分:0)

首先获取当前用户的Windows登录

var windowsUserName= HttpContext.Current.User.Identity.WindowsLogin();

然后使用System.DirectoryServices

为您的用户获取所有AD组
using System.DirectoryServices;

        public List<string> GetUsersActiveDirectoryGroups(string windowsUserName)
        {
            try
            {
                var allUserGroups = new List<string>();

                if (windowsUserName == null) return allUserGroups;

                var domainConnection = new DirectoryEntry();

                var samSearcher = new DirectorySearcher
                {
                    SearchRoot = domainConnection,
                    Filter = "(samAccountName=" + windowsUserName + ")"
                };
                samSearcher.PropertiesToLoad.Add("displayName");

                var samResult = samSearcher.FindOne();
                if (samResult == null) return allUserGroups;

                var theUser = samResult.GetDirectoryEntry();
                theUser.RefreshCache(new[] { "tokenGroups" });
                _bet365EmployeeFullName = theUser.Properties["CN"].Value.ToString();

                foreach (byte[] resultBytes in theUser.Properties["tokenGroups"])
                {
                    var mySid = new SecurityIdentifier(resultBytes, 0);

                    var sidSearcher = new DirectorySearcher
                    {
                        SearchRoot = domainConnection,
                        Filter = "(objectSid=" + mySid.Value + ")"
                    };
                    sidSearcher.PropertiesToLoad.Add("name");

                    var sidResult = sidSearcher.FindOne();
                    if (sidResult != null)
                    {
                        allUserGroups.Add((string)sidResult.Properties["name"][0]);
                    }
                }

                return allUserGroups;
            }

您现在需要映射哪些组可以访问应用程序中的哪个视图。 完成后,下一步是限制查看“视图”。

您需要设置使用MVC AuthorizeAttribute的权限过滤器。像下面的东西。

public class PermissionsFilter : AuthorizeAttribute
    {
        private readonly string _viewName;

        public PermissionsFilter(string viewName)
        {
            _viewName = viewName;
        }

        public override void OnAuthorization(AuthorizationContext filterContext)
        {
           //Check to see if users groups has access to the view
           //If not redirect to unauthorized page
        }
    }

我通过在会话中保存用户对象来完成上述操作。它包含我的用户也可以访问的所有应用程序权限的列表。这是您需要做的映射。我将所有视图名称与AD组可以访问的ID一起存储在数据库中。

然后最后在控制器中,相应地修饰视图的get动作。

[HttpGet]
[PermissionsFilter("ViewName")]
public ActionResult ReturnMyView(int currentFolderID)
 {
    return View(); //Etc..
 }

希望有所帮助!