是否可以创建由Active Directory组严格控制的页面(View)?
此页面没有登录信息,如果您是“VIP”Active Directory组的成员,则会呈现该页面,否则您将无法查看该页面。
答案 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..
}
希望有所帮助!