使用基于声明的身份验证对SharePoint 2010的相同AD进行身份验证时,区分Windows Auth和Forms Auth用户

时间:2010-02-12 23:44:13

标签: c# sharepoint authentication sharepoint-2010

我目前正在开发一个SharePoint 2010项目,其中使用基于声明的身份验证的SharePoint Web应用程序设置环境。 Web应用程序在端口8081上使用Windows身份验证进行身份验证,并使用基于表单的身份验证扩展到端口80。

表单身份验证提供程序设置为使用与基于Windows身份验证的站点相同的活动目录,使用应用程序的web.config中的以下条目(这些条目也在中央管理和安全令牌服务web.config文件中):

    <membership defaultProvider="i">
  <providers>
    <add name="i" type="Microsoft.SharePoint.Administration.Claims.SPClaimsAuthMembershipProvider, Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" />
    <add name="FBA_AD_MP" type="System.Web.Security.ActiveDirectoryMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="ADFBAConnectionString" enableSearchMethods="true" attributeMapUsername="userPrincipalName" />
  </providers>
</membership>

使用此设置按预期工作;在端口8081上访问应用程序的用户将看到标准的Windows身份验证质询,端口80上的用户将被定向到自定义登录表单。通过现成的管理工具将用户添加到站点时,搜索特定用户(如john.smith@mydomain.com)将返回两个匹配,一个来自Windows身份验证提供程序,另一个来自表单身份验证提供程序。将这两个用户添加到站点会显示SharePoint存储帐户名称,并在前面附加标识符。 windows auth用户被翻译为i:0#.w | mydomain \ johnsmith,FBA用户被翻译为i:0#.f | fba_ad_mp | john.smith@mydomain.com。

以下是问题所在。我们使用自定义构建工具批量创建网站集,该工具解析输入电子表格,创建网站集,并使用以下方法将适当的用户添加到新创建的网站:

    private static void AddUser(SPSite site, String userName, String spGroupName)
    {
        try
        {
            SPUser spUser = site.RootWeb.EnsureUser(userName);

            if (spUser != null)
            {
                site.RootWeb.Groups[spGroupName].AddUser(spUser);
            }
        }
        catch(Exception ex)
        {
            SharePointManager.Counter.Warnings++;
            SharePointManager.Logger.Warn(String.Format("\t\tUnable to add user {0} to group {1} at site {2}: {3}", userName, spGroupName, site.RootWeb.Url, ex.ToString()));
        }
    }

传入的userName参数遵循示例john.smith@mydomain.com。但是,添加到站点的用户始终是基于Windows身份验证的用户,i:0#.w | mydomain \ johnsmith。

如何在调用EnsureUser时指定要轮询的身份验证提供程序,以便我可以保证将正确的用户添加到站点中?

2 个答案:

答案 0 :(得分:1)

问题是两个成员资格提供者都识别出电子邮件地址,并且第一个结果(AD)被使用。尝试FBA_AD_MP:john.smith@mydomain.com - 该语法在标准用户名控件中工作(使用检查名称而不是搜索对话框),我相信EnsureUser的工作方式相同。

答案 1 :(得分:0)

简而言之,您需要使用SPClaimProviderManager将SPUser转换为SPClaim