2017-08-04 84 views
0

是否可以創建一個由Active Directory組嚴格控制的頁面(View)?ASP.NET MVC 5頁由Active Directory Group控制

沒有登錄這個頁面,如果你是「VIP」Active Directory組的成員,那麼該頁面被渲染,否則如果沒有,那麼你看不到它。

+0

這是肯定的......但你需要存儲你自己的映射,哪些組可以訪問哪些視圖。 – Wheels73

+0

你有任何代碼示例或指向我在哪裏看? – fes

+0

當然..我會給你一個答案。你已經有訪問AD組的代碼了嗎? – Wheels73

回答

0

首先讓你的當前用戶的Windows登錄

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

然後,使用的System.DirectoryServices

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; 
      } 

現在,您需要映射哪些羣體有機會獲得所有用戶的AD組該應用程序中的哪個視圖。 完成後,下一步是限制「視圖」的查看。

您需要設置使用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 
     } 
    } 

我通過在session中擁有一個用戶對象來完成上述任務。這包含我的用戶可以訪問的所有應用程序權限的列表。這是你需要做的映射。我將所有視圖名稱與AD組可以訪問的ID一起存儲在數據庫中。

然後最後在控制器中,相應地爲視圖裝飾獲取動作。

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

好希望幫助!