当使用基于声明的身份验证,在与同一AD进行身份验证时,如何区分Windows身份验证和表单身份验证用户?

6
我目前正在从事一个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身份验证提供程序,另一个来自Forms身份验证提供程序。向站点添加这两个用户会发现SharePoint将帐户名存储在前面附加了标识符的形式。Windows身份验证用户转换为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个回答

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

我在人员选择器中看到了相同的行为(不搜索),但确保用户方法不喜欢那种格式。然而,如果我在用户名前面加上“i:0#.f|fba_ad_mp|”,它可以正常工作。目前,我将其作为配置项处理,但我很好奇在对象模型中可以可靠地找到这些前缀以应对更复杂的情况。 - Preston Guillot

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

有什么意义呢?SPGroup.AddUser()没有重载接受SPClaim的方法,也没有SPClaim包含任何特定于任何提供程序的SPUser的引用。 - Preston Guillot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接