次の方法で共有


.NET Connectivity Assembly 内から Secure Store Service を使用する

最終更新日: 2010年9月27日

適用対象: SharePoint Server 2010

この記事の内容
.NET Connectivity Assembly で Secure Store を使用するためのコードを使用しない方式
.NET Connectivity Assembly で Secure Store を使用するためのコードを使用する方式
概要

データベース、Web サービス、および Windows Communication Foundation (WCF) サービス コネクタはすべて、外部システムを 1 つのみ使用します。Microsoft Business Connectivity Services (BCS) は、これらの外部システムに接続でき、これらのコネクタに対する Secure Store 統合をネイティブにサポートします。しかし Microsoft .NET Framework アセンブリ コネクタの場合, .NET アセンブリ コードは外部システムを使用しないか、1 つ以上の外部システムを使用することができます。Business Connectivity Services は, .NET アセンブリ コードが実行することを判断できないため, .NET アセンブリ コネクタに対する Secure Store 統合をネイティブにサポートしません。しかし Business Connectivity Services は, .NET Connectivity Assembly 内で Secure Store を使用するための 2 つの異なるメカニズムを備えています。

最初のメカニズム (コードを使用しない方式) では、Business Connectivity Services が、Secure Store から資格情報を読み取るために必要な操作を実行します。2 つ目のメカニズム (コードを使用する方式) では, .NET Connectivity Assembly が必要な操作を実行します。このトピックでは、この 2 つのメカニズムについて説明します。

.NET Connectivity Assembly で Secure Store を使用するためのコードを使用しない方式

名前が示すように, .NET Connectivity Assembly は Secure Store を直接操作しません。フィルターを介して Business Connectivity Services を使用し、Secure Store から資格情報を読み取ったり、メソッドへの入力パラメーターとして資格情報を取得したりすることができます。この方式は, .NET Assembly Connector に特有のものではなく、データベース コネクタ、Web サービス コネクタ、および WCF コネクタとともに使用できます。

.NET Cnnectivity Asembly でメソッドを作成する場合、資格情報用の入力パラメーターが必要です。以下の例は、username および password 用の入力パラメーターと他のパラメーターを持つ GetEntity メソッドを示しています。

public SampleEntity GetEntity(string username, string password, int id)
{ 
    // Parameters username and password 
    // contain the credentials.
}

username パラメーターおよび password パラメーターの資格情報を取得するには、UsernameFilter フィルターと PasswordFilter フィルターを使用する必要があります。メタデータ モデルでは、LobSystemInstance に対して SecondarySsoApplicationId プロパティと SsoProviderImplementation プロパティを定義し、フィルターをメソッドの適切な入力パラメーターに関連付ける必要があります。Business Connectivity Services は、フィルターを見つけると、Secure Store ターゲット アプリケーション ID および Secure Store プロバイダーでそれぞれ SecondarySsoApplicationId プロパティと SsoProviderImplementation プロパティを使用します。

<LobSystemInstance ...> 
  <Properties> 
    <!-- Other properties omitted. –> 
    <Property Name="SecondarySsoApplicationId" 
        Type="System.String">MyLobAppId</Property> 
    <Property Name="SsoProviderImplementation" Type="System.String"> 
        Microsoft.Office.SecureStoreService.Server.SecureStoreProvider, Microsoft.Office.SecureStoreService, 
        Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c</Property> 
  </Properties> 
</LobSystemInstance> 

メソッドに 2 つのフィルターを定義します。

<Method Name="GetEntity"> 
  <FilterDescriptors> 
    <FilterDescriptor Type="Username" Name="UserNameFilter"/> 
    <FilterDescriptor Type="Password" Name="PasswordFilter"/> 
  </FilterDescriptors> 
</Method>

メソッドにフィルターが定義されたので、以下の例では、2 つのフィルターをメソッドの入力パラメーターに関連付ける方法を示します。

<Parameter Direction="In" Name="username">  
    <TypeDescriptor TypeName="System.String" Name="username" 
        AssociatedFilter="UserNameFilter"/> 
</Parameter> 
<Parameter Direction="In" Name="password">  
    <TypeDescriptor TypeName="System.String" Name="password" 
        AssociatedFilter="PasswordFilter"/> 
</Parameter>

.NET Connectivity Assembly で Secure Store を使用するために行うことはこれだけです。Business Connectivity Services は、メソッドを実行すると、Secure Store から資格情報を読み取り、メソッドの入力パラメーターにその資格情報を設定します。

.NET Connectivity Assembly で Secure Store を使用するためのコードを使用する方式

Secure Store を使用するためのコードを作成する前に、Business Connectivity Services が他のコネクタで Secure Store を使用する方法を理解する必要があります。Business Connectivity Services では、他のコネクタは、Secure Store とターゲット アプリケーション ID に関して必要な情報を得るためにメタデータ モデルを使用します。コネクタは、この情報を使用して、外部システムで認証するための資格情報を取得します。たとえばデータベース コネクタの場合、メタデータ モデルの LobSystemInstance のプロパティは、以下のように表示されます。

<LobSystemInstance ...> 
  <Properties> 
    <!-- Other properties omitted. –> 
    <Property Name="SsoApplicationId" 
        Type="System.String">MyLobAppId</Property> 
    <Property Name="SsoProviderImplementation" Type="System.String"> Microsoft.Office.SecureStoreService.Server.SecureStoreProvider, Microsoft.Office.SecureStoreService, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c</Property> 
  </Properties> 
</LobSystemInstance>

データベース コネクタはメタデータ モデルを読み取り、データベースに接続するための資格情報が必要であること、そしてこの資格情報は特定の Secure Store プロバイダーから取得できることを断定します。データベース コネクタは、Secure Store プロバイダーに関する必要な情報を得たら、プロバイダーから資格情報を読み取り、データベース接続のユーザーになりすまします。

以下のセクションでは, .NET アセンブリ コード内のメタデータ モデル プロパティを読み取り、Secure Store API を使用してユーザー資格情報を読み取る方法を説明します。

.NET Connectivity Assembly 内のメタデータ モデル プロパティを読み取る

.NET Connectivity Assembly 内のメタデータ モデル プロパティを読み取るには, .NET アセンブリ内のコードが IContextProperty インターフェイスを実装する必要があります。以下のコードは、IContextProperty インターフェイスの実装例を示しています。

IContextProperty の実装例

using IContextProperty = Microsoft.BusinessData.SystemSpecific.IContextProperty; 
public class SampleConnector : IContextProperty 
{ 
    private IMethodInstance methodInstance; 
    private ILobSystemInstance lobSystemInstance; 
    private IExecutionContext executionContext;
    #region IContextProperty implementation 
    public IMethodInstance MethodInstance 
    { 
        get { return this.methodInstance; } 
        set { this.methodInstance = value; } 
    }
    public ILobSystemInstance LobSystemInstance 
    { 
        get { return this.lobSystemInstance; } 
        set { this.lobSystemInstance = value; } 
    } 
    public IExecutionContext ExecutionContext 
    { 
        get { return this.executionContext; } 
        set { this.executionContext = value; } 
    } 
        #endregion 
        // Unrelated code removed for brevity. 
} 

.NET Connectivity Assembly クラスが IContextProperty インターフェイスを実装するとき、Business Connectivity Services ランタイムは自動的に IContextProperty プロパティを初期化します。

実行時、コードには、コードが実行されるコンテキスト (メソッド インスタンスおよび LobSystem Instance) があります。コードに実装されるメソッドは、メタデータ モデルからプロパティを読み取ることができます。以下のコードは、LobSystemInstance プロパティが読み取られる方法を示しています。

public SampleEntity GetEntity(int id) 
{ 
    // Read the LobSystemInstance property defined in the metadata model. 
    string provider =  
        LobSystemInstance.GetProperties()["ssoProviderImplementation"] 
        as string; 
    // Unrelated code removed for brevity. 
} 

Secure Store Service を操作する

.NET Connectivity Assembly が Secure Store から 1 つの資格情報を読み取る必要がある場合、以下のプロパティ名を使用します。

  • ssoProviderImplementation   Secure Store プロバイダー

  • SecondarySsoApplicationId   Secure Store のターゲット アプリケーション

Microsoft SharePoint Designer 2010 で .NET Assembly Connector モデルをモデル化するために、ssoProviderImplementation プロパティと SecondarySsoApplicationId プロパティがサポートされています。.NET Connectivity Assembly が Secure Store から複数の資格情報を読み取る必要がある場合、シナリオに最も有用なプロパティ名を選択します。

Secure Store から資格情報を読み取るための実装例

最初に、プロバイダー実装から Secure Store プロバイダーをインスタンス化します。コード内で、プロバイダーが ISecureStoreProvider インターフェイスを実装していることを確認します。以下の例は、Secure Store プロバイダーをインスタンス化するための簡単な実装を示しています。

private ISecureStoreProvider GetSecureStoreProvider() 
{
    // Error checking removed for brevity.
string provider = this.LobSystemInstance.GetProperties()  
    ["ssoProviderImplementation"] as string; 
Type providerType = Type.GetType(provider); 
return Activator.CreateInstance(providerType)  
    as ISecureStoreProvider;
} 

Secure Store プロバイダーがインスタンス化されたら、Secure Store から資格情報を取得します。Secure Store は、ユーザーとターゲット ID に対応する SecureStoreCredentialCollection を返します。それには資格情報のコレクションが含まれています。ISecureStoreCredential インターフェイスでは、資格情報の種類と値を定義します。

以下の例は、資格情報が Secure Store から読み取られる方法を示します。これらの資格情報は、外部システムの認証に使用できます。

private void ReadCredentialsFromSecureStore() 
{ 
    // Error checking removed for brevity. 
    string targetId = 
        LobSystemInstance.GetProperties()["SecondarySsoApplicationId"]  
        as string; 
    ISecureStoreProvider provider = GetSecureStoreProvider();
    // Get the credentials for the user on whose behalf the code 
    // is executing. 
    using(SecureStoreCredentialCollection credentials =      
        provider.GetRestrictedCredentials(targetId)) 
    { 
        SecureString secureUsername; 
        SecureString securePassword; 
         // Look for username and password in credentials. 
        foreach (ISecureStoreCredential credential in credentials) 
        { 
            switch (credential.CredentialType) 
            { 
                case SecureStoreCredentialType.UserName: 
                case SecureStoreCredentialType.WindowsUserName: 
                    secureUsername = credential.Credential; 
                    break; 
                case SecureStoreCredentialType.Password: 
                case SecureStoreCredentialType.WindowsPassword: 
                    securePassword = credential.Credential; 
                    break; 
                default: 
                    break; 
            } 
        } 
        // Username and password have been read. 
        // Use them as necessary.  
    } 
     // NOTE:  Because we are getting the credentials in the using block,  
    // all the credentials that we get will be disposed after the 
    // using block. If you need to cache the credentials,  do not use 
    // a using block but dispose the credentials when you are done 
     // with them.
} 

概要

シナリオに応じて、コードを使用しない方式またはコードを使用する方式のどちらかを選択し, .NET Connectivity Assembly で Secure Store を使用できます。表 1 は、この 2 つの方式の違いを要約しています。

表 1. コードを使用しない方式とコードを使用する方式の違いの概要

領域

コードを使用しない方式

コードを使用する方式

Secure Store API の操作が必要

いいえ

はい

.NET Assembly Connector に限定

いいえ

はい

SharePoint Designer のサポート

はい

一部

メソッド署名への影響

はい

いいえ

複数の Secure Store からの読み取り

いいえ

はい

資格情報を LobSystemInstance レベルで設定可能

いいえ

はい