6

私は現在、クレーム ベース認証を使用する SharePoint Web アプリケーションで環境がセットアップされている SharePoint 2010 プロジェクトに取り組んでいます。Web アプリは、認証に Windows 認証を使用してポート 8081 で作成され、フォーム ベース認証を使用してポート 80 に拡張されます。

フォーム認証プロバイダーは、アプリケーションの web.config 内の次のエントリを使用して、Windows 認証ベースのサイトと同じ Active Directory を使用するようにセットアップされます (エントリは、集中管理およびセキュリティ トークン サービスの 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 などの特定のユーザーを検索すると、2 つのヒットが返されます。1 つは Windows 認証プロバイダーから、もう 1 つはフォーム認証プロバイダーからのものです。これらの両方のユーザーをサイトに追加すると、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 を呼び出すときにポーリングする認証プロバイダーを指定するにはどうすればよいですか?

4

2 に答える 2

1

問題は、両方のメンバーシップ プロバイダーがメール アドレスを認識し、最初の結果 (AD) が使用されることです。FBA_AD_MP:john.smith@mydomain.com を試してみてください。この構文は標準のユーザー名コントロール (検索ダイアログではなく名前の確認を使用) で機能し、EnsureUser も同じように機能すると思います。

于 2010-02-13T01:29:30.700 に答える
0

つまり、SPClaimProviderManager を使用して SPUser を SPClaim に変換する必要があります。

于 2010-09-19T10:28:58.557 に答える