• SharePoint 2013 同步FBA认证用户


      SharePoint 开启了基于FBA的身份认证,常常会遇到用户组用户的问题,当我加入一个AD账号。无法同一时候加入Form认证的用户,这时。仅仅能手动加入,比較麻烦;所以。写了一个服务。用来每天晚上同步一下用户组中的AD账号和Form账号。

    原理

      原理比較简单,就是遍历用户组的全部用户,同步的时候首先删掉全部的Form账号,然后依据全部的AD账号去查找Form账号又一次加入;假设碰到AD安全组,就去安全组中遍历全部的用户。然后查找Form账号加入,每天晚上定时运行。

    长处

      免去加入账号的时候加入2次。并且服务能够手动运行,定时运行等。

    缺点

      并不是实时同步,并且无法单独在用户组中加入Form账号,无法满足断开权限,无法满足单独依照人授权的情况。

    总结

      在自己的需求中,用户权限控制比較简单,均依照用户组授权。没有唯一权限设置,所以用起来还是挺好的,并且用户对于Form账号没有实时的要求。假设复杂的权限控制,还需进一步增强代码,呵呵。

    效果

      运行前,仅仅有AD账号和AD安全组,例如以下图:

    clip_image002

      运行后,多出了全部Form认证的账号,例如以下图:

    clip_image004

    代码片段

      遍历全部用户组

     1 using (SPSite site = new SPSite("http://SPServer"))
     2 {
     3     using (SPWeb web = site.RootWeb)
     4     {
     5         foreach (SPGroup group in web.Groups)
     6         {
     7             foreach (SPUser user in group.Users)
     8             {
     9                 if (user.LoginName.IndexOf("custommembership") > 0)
    10                 {
    11                     group.RemoveUser(user);
    12                 }
    13             }
    14 
    15             foreach (SPUser user in group.Users)
    16             {
    17                 if (user.LoginName.IndexOf("domain") > 0)
    18                 {
    19                     group.Users.Add("i:0#.f|custommembership|" + user.Email, user.Email, user.LoginName, user.Notes);
    20                 }
    21 
    22                 if (user.IsDomainGroup)
    23                 {
    24                     DomainGroup(group, user.Name);
    25                 }
    26             }
    27         }
    28     }
    29 }

      去AD文件夹中查找AD账号

     1 public static string DomainGroup(SPGroup group, string DomainGroupName)
     2 {
     3     string returnStr = string.Empty;
     4     SearchResultCollection results = null;
     5 
     6     string filter = "(&(objectClass=group)(cn=" + DomainGroupName + "))";
     7     string connectionPrefix = "LDAP://linyu.ad.com.cn";
     8     using (DirectoryEntry root = new DirectoryEntry(connectionPrefix))
     9     {
    10         using (DirectorySearcher searcher = new DirectorySearcher(root))
    11         {
    12             searcher.ReferralChasing = ReferralChasingOption.All;
    13             searcher.SearchScope = SearchScope.Subtree;
    14             searcher.Filter = filter;
    15             results = searcher.FindAll();
    16         }
    17     }
    18     foreach (SearchResult sr in results)
    19     {
    20 
    21         DirectoryEntry deGroup = new DirectoryEntry(sr.Path);
    22         System.DirectoryServices.PropertyCollection pcoll = deGroup.Properties;
    23         int n = pcoll["member"].Count;
    24         Console.WriteLine(n.ToString());
    25 
    26         for (int i = 0; i < n; i++)
    27         {
    28             DirectoryEntry deUser = new DirectoryEntry(connectionPrefix + "/" + pcoll["member"][i].ToString());
    29 
    30             string username = deUser.Name.ToString();
    31             if (username.IndexOf("=") > 0)
    32             {
    33                 username = username.Split('=')[1];
    34             }
    35 
    36             string email = GetProperty(deUser, "mail");
    37             if (email.IndexOf("@") > 0)
    38             {
    39                 Console.WriteLine(username);
    40                 group.AddUser("i:0#.f|custommembership|" + email, email, username, "");
    41             }
    42         }
    43     }
    44     return returnStr;
    45 }
    46 
    47 public static string GetProperty(DirectoryEntry oDE, string PropertyName)
    48 {
    49     try
    50     {
    51         if (oDE.Properties.Contains(PropertyName))
    52         {
    53             return oDE.Properties[PropertyName][0].ToString();
    54         }
    55         else
    56         {
    57             return string.Empty;
    58         }
    59     }
    60     catch (Exception ee)
    61     {
    62         throw ee;
    63     }
    64 }
    View Code

    后记

      思路、代码比較简单。希望给大家一个參考吧;运行过程中,能够封装成TimerJob、控制台和Windows计划任务、Windows服务等均可,看大家须要和熟悉程度吧。

      好吧,就到这里。歇息。歇息一下。

    。。

  • 相关阅读:
    渗透学习——资料整理
    c语言——运算符、分支结构、循环结构
    c语言——字符串变量、函数
    总结Java开发者经常会犯的前十种错误
    项目开发遇到的问题及其解决.总结
    Java开发者写SQL时常犯的10个错误
    Java开发中常见的异常问题
    Java编程:常见问题汇总
    Exploded location overlaps an existing deployment解决办法
    Eclipse下svn的创建分支/合并/切换使用
  • 原文地址:https://www.cnblogs.com/claireyuancy/p/6809441.html
Copyright © 2020-2023  润新知