次の方法で共有


[ウォークスルー] プラグ可能な SSO プロバイダを実装する

Microsoft Office SharePoint Server 2007 では、サード パーティまたはバックエンド システムと接続する際に使用する資格情報の格納とマッピングのために、既定で Microsoft シングル サインオン (SSO) サービスが提供されます。多くの企業は既に社内での資格情報格納システムを開発済みであるか、Microsoft シングル サインオン サービス以外のソリューションを使用しています。2 つの場所で資格情報のマッピングを維持する代わりの方法として、Office SharePoint Server 2007 には、プラグ可能な SSO と呼ばれるメカニズムが用意されています。この機能により、Office SharePoint Server 2007 の標準 SSO プロバイダの代わりになる SSO プロバイダを指定できます。

前提条件

SSO プロバイダを構築する前に、環境をセットアップする必要があります。このウォークスルーは、Office SharePoint Server 2007 をセットアップし、Microsoft ダウンロード センターから入手した AdventureWorks 2000 データベースのコピーをインストール済みで、ドメイン名が LITWAREINC であるようにしたことを前提にしています。異なるドメイン名を使用している場合は、このウォークスルーのコード例を調整する必要があります。

次の表に示すドメインのアカウントとグループが存在すると想定しています。

ExternalPartners

ドメイン グループ

InternalSales

ドメイン グループ

Tom Tompson

ドメイン ユーザー

Jerry Jones

ドメイン ユーザー

InternalAccess

ドメイン ユーザー

ExternalAccess

ドメイン ユーザー

データベースと必要なユーザー アカウントをセットアップする方法の詳細な手順については、AdventureWorks 2000 データベースと共に提供されている README.txt ファイルを参照してください。

シングル サインオン プロバイダを実装する

Office SharePoint Server 2007 で、既定の SSO プロバイダを置き換えるには、Microsoft.SharePoint.Portal.SingleSignon.ISsoProvider インターフェイスを実装し、このインターフェイスをグローバル アセンブリ キャッシュにインストールして、新しい SSO プロバイダを Office SharePoint Server 2007 に登録する必要があります。

Office SharePoint Server 2007 に登録できる SSO プロバイダは 1 つだけです。新しい SSO プロバイダを登録すると、Office SharePoint Server 2007 での既定の SpsSsoProvider クラスが置き換えられます。一度に使用できる SSO プロバイダは 1 つだけなので、カスタム SSO プロバイダの使用時は、Microsoft シングル サインオン サービスを停止することをお勧めします。

最小限機能する SSO プロバイダを作成するには、ISsoProvider インターフェイスの GetCredentials メソッドと GetSsoProviderInfo メソッドを実装する必要があります。このウォークスルーでは、簡単な SSO プロバイダを作成し、それを使用してビジネス データ カタログ経由でデータにアクセスする方法を示します。

このウォークスルーで作成するカスタム SSO プロバイダは、AdventureWorks 2000 データベースから製品データを取得するため、InternalSales グループに属するユーザーを、InternalAccess ユーザー アカウントにマップします。

プロバイダを構築する

ここでは、簡単な SSO プロバイダを構築し、登録する方法を示し、プロバイダのための例外処理について説明します。

ダウンロード    サンプル プロバイダをダウンロードするには、「SharePoint Server 2007 SDK: ソフトウェア開発キットおよびエンタープライズ コンテンツ管理スタータ キット」を参照してください。

SSO プロバイダ アセンブリは、Microsoft Visual Studio 2005 で、クラス ライブラリ プロジェクトを作成することによって作成します。プロジェクトには、Microsoft.SharePoint.Portal.SingleSignon.dll (%ProgramFiles%\Common Files\Microsoft Shared\web server extensions\12\ISAPI ディレクトリに収録されています) への参照を追加します。次の例に示すように、ISsoProvider インターフェイスを実装します。

using System;
using System.Collections.Generic;
using System.Reflection;
using System.Text;
using System.Web;
using System.Web.Services;
using Microsoft.SharePoint.Portal.SingleSignon;

namespace SampleSSOProvider
{
    /// <summary>
    /// SimpleSSOProvider
    /// </summary>
    public class SimpleSSOProvider: ISsoProvider
    {
        public Application.ApplicationInfo[] GetApplicationDefinitions()
        {
            //NOTE: Used by SpsSsoProvider, not necessary for SimpleSSOProvider
            throw new NotSupportedException();
        }
        public Application.ApplicationField[] GetApplicationFields(string AppID)
        {
            //NOTE: Used by SpsSsoProvider, not necessary for SimpleSSOProvider
            throw new NotSupportedException();
        }

public Application.ApplicationInfo GetApplicationInfo(string AppID)
        {
            Application.ApplicationInfo applicationInfo = new Application.ApplicationInfo("SimpleSSOProvider", "SimpleSSOProvider", Application.ApplicationType.GroupWindows, "sso@litwareinc.com");

            Application.ApplicationInfo applicationInfo = new Application.ApplicationInfo("SimpleSSOProvider","SimpleSSOProvider",Application.ApplicationType.GroupWindows,"sso@litwareinc.com", (SsoCredentialContents)((Int32)SsoCredentialContents.UserName + (Int32)SsoCredentialContents.Password + (Int32)SsoCredentialContents.WindowsCredentials));
            */

            return applicationInfo;
        }
        public Uri GetCredentialManagementURL(string AppID)
        {
            //NOTE: Used by SpsSsoProvider, not necessary for SimpleSSOProvider
            throw new NotSupportedException();
        }
        public SsoCredentials GetCredentials(string AppID)
        {
            //Note: Used by SpsSsoProvider, necessary for any SimpleSSO Provider. Implementation discussed in detail in the next section of this topic
        }
        public SsoCredentials GetCredentialsUsingTicket(string Ticket, string AppID)
        {
            //NOTE: Used by SpsSsoProvider, necessary for Simple SSO Provider when used by Excel Services.
            //TODO: Implement Ticket management code; currently just return SsoCredentials
            return GetCredentials(AppID);
        }
        public string GetCurrentUser()
        {
            //NOTE: Used by SpsSsoProvider, not necessary for SimpleSSOProvider
            throw new NotSupportedException();
        }

public SsoCredentials GetSensitiveCredentials(string AppID)
{
    //NOTE: Used by SpsSsoProvider, necessary for Simple SSOProvider when used by Excel Services

    //TODO: Implement Sensitive Credential method, for sample just returning basic credentials
    return GetCredentials(AppID);
}
        public SsoProviderInfo GetSsoProviderInfo()
        {
            //TODO: Used by SpsSsoProvider, necessary for any SimpleSSOProvider
        }
        public string GetTicket()
        {
            //NOTE: Used by SpsSsoProvider, necessary for SimpleSSOProvider when used by Excel Services
            //TODO: Implement Ticket management code; currently just return a string
            return "No Ticket Management";
        }
        public void PutIdentityOnRequest(ref System.Web.Services.Protocols.HttpWebClientProtocol request, string AppID)
        {
            //NOTE: Used by SpsSsoProvider, not necessary for SimpleSSOProvider
            throw new NotSupportedException();
        }
        public void PutIdentityOnRequestUsingTicket(ref System.Web.Services.Protocols.HttpWebClientProtocol request, string Ticket, string AppID)
        {
            //NOTE: Used by SpsSsoProvider, not necessary for SimpleSSOProvider
            throw new NotSupportedException();
        }
    }
}

少なくとも、GetCredentials メソッドと GetSsoProviderInfo メソッドを実装する必要があります。作成した SimpleSSOProvider クラスは、現在のユーザーおよび指定したアプリケーション ID (AppID) に基づいた新しい資格情報を返します。現在のユーザーに関する情報は、System.Threading.Thread.CurrentPrincipal で実行しているスレッドの CurrentPrincipal property を使用して取得できます。次のコードに、GetCredentials メソッドの実装を示します。

public SsoCredentials GetCredentials(string AppID)
{
    //NOTE: Used by SpsSsoProvider, necessary for any SimpleSSOProvider
    System.Diagnostics.Trace.WriteLine("Entering SimpleSSOProvider::GetCredentials");
    System.Diagnostics.Trace.Indent();
    // Retrieve the logged in user's information
    string domain = System.Environment.UserDomainName;
    System.Diagnostics.Trace.WriteLine("User domain is " + domain);
    
    try {
        System.Diagnostics.Trace.WriteLine("Context user:" + System.Threading.Thread.CurrentPrincipal.Identity.Name);
        // Start building an SsoCredentials object to store two values - UserName and Password
        SsoCredentials creds = new SsoCredentials();
        creds.Evidence = new System.Security.SecureString[2];

        switch (AppID){
            case "AdventureWorks":
                System.Diagnostics.Trace.WriteLine("Application is AdventureWorks");

                if (System.Threading.Thread.CurrentPrincipal.IsInRole("InternalSales"))
                {
                    System.Diagnostics.Trace.WriteLine("User is in InternalSales? " + System.Threading.Thread.CurrentPrincipal.IsInRole("InternalSales"));
                    // Provide components for the InternalAccess account token
                    creds.Evidence[0] = MakeSecureString(domain + "\\InternalAccess");
                    creds.Evidence[1] = MakeSecureString("pass@word1");
                }
                else
                {
                    // Provide components for the ExternalAccess account token
                    creds.Evidence[0] = MakeSecureString(domain + "\\ExternalAccess");
                    creds.Evidence[1] = MakeSecureString("pass@word1");
                }
                break;

            default:
                throw new SingleSignonException(SSOReturnCodes.SSO_E_APPLICATION_NOT_FOUND);
        }

        // Put the UserName/Password values into the credential object
        creds.UserName = creds.Evidence[0];
        creds.Password = creds.Evidence[1];

        System.Diagnostics.Trace.Unindent();
        return creds;
    }
    catch(SingleSignonException ex) {
        System.Diagnostics.EventLog.WriteEntry("SimpleSSOProvider", "Caught SSO Exception: " + ex.ToString());
        throw;
    }
    catch(Exception ex) {
        System.Diagnostics.EventLog.WriteEntry("SimpleSSOProvider", "Caught Exception: " + ex.ToString());
        throw new SingleSignonException(SSOReturnCodes.SSO_E_EXCEPTION, ex);
    }
}

SsoProvider 実装には、SsoCredentialsContents は必要ありませんが、他の特定のクライアント アプリケーションには SsoCredentialsContents が必要な場合があります。ここで示す例では、Excel Services は設定された UserName と Password を使用して、Windows ログオンによってリソースに接続しようとします。WindowsCredentials の値が指定されていない場合、接続文字列で UserName と Password が設定されます。

名前

説明

なし

Evidence は指定されません。

UserName

UserName が存在する場合に設定します。

Password

Password が存在する場合に設定します。

Evidence

拡張フィールド (UserName と Password を含めて合計 5 つまで) を使用している場合に設定します。

MappedGroup

アプリケーション定義が Group 定義の場合に設定します。

WindowsCredentials

アプリケーション定義が Windows 認証の場合に設定します。

GetSsoProviderInfo メソッドは、次の例に示すように、ベンダの名前、バージョンなど、プロバイダについての情報を単純に返します。

        public SsoProviderInfo GetSsoProviderInfo()
        {
            //NOTE: Used by SpsSsoProvider, necessary for any SimpleSSOProvider
            SsoProviderInfo ssoProvInfo = new SsoProviderInfo();

            ssoProvInfo.AssemblyName = Assembly.GetExecutingAssembly().FullName;
            ssoProvInfo.Vendor = "AdventureWorks";
            ssoProvInfo.Version = "1.0";            

            return ssoProvInfo;
        }

SSO プロバイダが Excel Services によって使用される場合は、GetCredentialsUsingTicket メソッドと GetTicket メソッドの実装も備える必要があります。

作成した SimpleSsoProvider クラスは、SSO プロバイダの非常に簡単な例を示しています。実際の実装では、セキュリティで保護したリポジトリから資格情報を取得し、それらがメモリ内に格納されている間はすべての値を保護する必要があります。

GetCredentials によって返された SsoCredentials オブジェクトは、SecureString クラスを使用して UserName および Password の両プロパティと、すべての Evidence の値を格納します。SecureString は、容易に暗号解読できないようにデータを暗号化します。

例外処理

この SimpleSSOProvider は、AppID を適切に判断できない場合、SingleSignonException のインスタンスをスローし、標準の SSOReturnCodes フィールドを使用します。次の表では、エラーが発生したいくつかの場合について、一般的な SSOReturnCodes フィールドの一部を示します。

名前

説明

SSO_E_ACCESSDENIED

アクセスが拒否されました。

SSO_E_CREDS_NOT_FOUND

要求したユーザーまたはアプリケーションの資格情報が見つかりませんでした。

SSO_E_SSO_NOT_CONFIGURED

SSO プロバイダ サービスが正しく構成されていません。

SSO_E_APPLICATION_NOT_FOUND

アプリケーション定義が見つかりません。

SSO_E_EXCEPTION

SSO プロバイダ サービスが例外をスローしました。

プロバイダを登録する

SimpleSSOProvider をインストールするには、グローバル アセンブリ キャッシュに登録してから、ProviderAdmin コンソール アプリケーション (インストールした Office SharePoint Server 2007 の bin ディレクトリに収録されています) を使用して登録する必要があります。ProviderAdmin アプリケーションは現在の SSO プロバイダを、指定した SSO プロバイダで置き換えます。サーバー ファーム環境では、新しい SSO プロバイダを、ファーム内の各コンピュータに登録する必要があります。次の手順では、プロバイダを登録する方法と、カスタム プロバイダを削除して元のプロバイダを再インストールする方法を示します。

SimpleSSOProvider を登録するには

  • ProviderAdmin ツールは、完全修飾アセンブリ名と、ISsoProvider インターフェイスを実装しているクラスの名前を受け取ります。この例に SimpleSSOProvider を登録するため、ProviderAdmin ツールは次のコマンドを実行します。

    Microsoft.SharePoint.Portal.SingleSignon.ProviderAdmin.exe 
    "SampleSSOProvider, Version=1.0.0.0, Culture=neutral, 
    PublicKeyToken=e447e624e7099fd1" 
    "SampleSSOProvider.SimpleSSOProvider"
    

カスタム SSO プロバイダを削除して元の SSO プロバイダを再インストールするには

  • カスタム SSO プロバイダを削除して元の SSO プロバイダを Office SharePoint Server 2007 に再インストールするには、次のコマンドを使用して SSO プロバイダの登録を解除します。

    Microsoft.SharePoint.Portal.SingleSignon.ProviderAdmin.exe /u
    

シングル サインオン プロバイダにアクセスする

SSO プロバイダにアクセスする必要がある Web パーツや他のコンポーネントは、Credentials オブジェクトを使わないようにする必要があります。Credentials オブジェクトを使用すると、ProviderAdmin ツールを使用して新しいプロバイダを登録済みであっても、Office SharePoint Server 2007 に含まれる既定の SSO プロバイダだけが取得されます。現在登録されている ISsoProvider への参照を取得するには、次の手順を使用します。

現在登録されている SSO プロバイダへの参照を取得するには

  • SsoProviderFactory クラスの GetSsoProvider メソッドを使用して、現在登録されている ISsoProvider への参照を取得します。コードでは、次のように ISsoProvider インターフェイスの GetCredentials メソッドを使用して、アプリケーションの資格情報を取得できます。

    ISSOProvider issop;
    issop = SsoProviderFactory.GetSsoProvider();
    SsoCredentials ssocred = issop.GetCredentials("AdventureWorks");
    

SsoCredentials クラスは、SecureString クラスを利用して資格情報へのアクセスを提供します。SecureString インスタンスを使用可能な形式に変換するため、次の例に示すように、SecureStringToBSTR メソッドなどの異なるメソッドをいくつか使用できます。

ISsoProvider provider = SsoProviderFactory.GetSsoProvider();
SsoCredentials creds = provider.GetCredentials("AdventureWorks");
IntPtr pUserName = IntPtr.Zero;
try
{
pUserName = System.Runtime.InteropServices.Marshal.SecureStringToBSTR(creds.UserName);
//NOTE: After this has been converted to a String object, it remains in 
//memory until the garbage collector collects it.
String userName = System.Runtime.InteropServices.Marshal.PtrToStringBSTR(pUserName);
}
finally
{
// Free zero out and free the BSTR pointers.
if (IntPtr.Zero != pUserName)
{
System.Runtime.InteropServices.Marshal.ZeroFreeBSTR(pUserName);
}
}

ビジネス データ カタログからシングル サインオン プロバイダを使用する

Web パーツから既定の SSO プロバイダへのアクセスが可能なことに加えて、ビジネス データ カタログの登録されたアプリケーションから、カスタム SSO プロバイダを使用することもできます。

ビジネス データ カタログでカスタム SSO プロバイダを使用するには

  • 基幹業務 (LOB) のデータベース システムでカスタム SSO プロバイダを使用するには、ビジネス データ カタログ スキーマを変更し、次のように、SsoApplicationId プロパティと SsoProviderImplementation プロパティを LOBSystemInstance XML タグに追加します。

    <LobSystemInstance Name="AdventureWorks2000(SampleSSO)">
    <Properties>
    <Property Name="AuthenticationMode" Type="System.String">WindowsCredentials</Property>
    <Property Name="SsoApplicationId" Type="System.String">AdventureWorks</Property>
    <Property Name="SsoProviderImplementation" Type="System.String">SampleSSOProvider.SimpleSSOProvider, SampleSSOProvider, Version=1.0.0.0, Culture=neutral, PublicKeyToken=e447e624e7099fd1</Property>
    
    <!—Database connection properties elided -->
    </Properties>
    </LobSystemInstance>
    

カスタム プロバイダは Windows の資格情報を返すため、AuthenticationMode プロパティは WindowsCredentials を受け取るように設定します。ビジネス データ カタログは、SSO プロバイダから資格情報を取得すると、データベースへのアクセスを取得しようとする前に、LogonUser() 呼び出しを実行して偽装をセットアップします。

この例では、AdventureWorks 2000 データベースから Product データを取得するために、ユーザーは InternalAccess アカウントまたは ExternalAccess アカウントのどちらかにマップされます。

Web サービスによる LOB システム用の SSO を実装するために必要な構成など、ビジネス データ カタログのスキーマの詳細については、「ビジネス データ カタログ : メタデータ モデル」の「LobSystemInstance」を参照してください。

Next Steps

既定の Office SharePoint Server 2007 SSO プロバイダを置き換える機能によって、SharePoint サイトと企業内で既に実施された投資とをより緊密に統合できます。また、社内で開発されたり、サード パーティ製パッケージの一部として供給された既存の資格情報ストアを活用できます。統合後は、Web パーツやビジネス データ カタログ オブジェクトからカスタム プロバイダにアクセスし、カスタム SSO プロバイダを最大限に活用することができます。