Использование службы Secure Store в сборке подключения .NET
Дата последнего изменения: 27 сентября 2010 г.
Применимо к: SharePoint Server 2010
В этой статье
Использование Secure Store в сборке подключения .NET без написания кода
Использование Secure Store в сборке подключения .NET с помощью кода
Сводка
Соединители для баз данных, веб-служб и службы Windows Communication Foundation (WCF) могут работать только с одной внешней системой. Microsoft Business Connectivity Services (BCS) может подключаться к внешним системам и обладает встроенной поддержкой интеграции с Secure Store для этих соединителей. Однако для соединителя сборки Microsoft .NET Framework в коде сборки .NET может использоваться одна внешняя система, несколько внешних систем или ни одной внешней системы. Поскольку Business Connectivity Services не может определить, какие действия выполняются в коде сборки .NET, встроенная поддержка интеграции с Secure Store для соединителя сборки .NET отсутствует. Однако Business Connectivity Services предоставляет два механизма использования Secure Store в сборке подключения .NET.
Первый механизм (без использования кода): все необходимые операции для считывания учетных данных из Secure Store выполняет Business Connectivity Services. Второй механизм (с использованием кода): все необходимые операции выполняет сборка подключения .NET. В данном разделе описаны оба механизма.
Использование Secure Store в сборке подключения .NET без написания кода
Как следует из названия, сборка подключения .NET не взаимодействует непосредственно с Secure Store. С помощью фильтров сборка подключения .NET может посредством Business Connectivity Services считывать учетные данные из Secure Store и передавать эти учетные данные методам в качестве входных параметров. Такой подход не является уникальным для соединителей сборок .NET и может применяться для соединителей баз данных, соединителей веб-служб и соединителей WCF.
При написании метода в сборке подключения .NET необходимо предусмотреть входные параметры для учетных данных. В следующем примере показан метод GetEntity с входными параметрами username (имя пользователя) и password (пароль) и рядом других параметров.
public SampleEntity GetEntity(string username, string password, int id)
{
// Parameters username and password
// contain the credentials.
}
Чтобы получить учетные данные в параметрах username и password, необходимо воспользоваться фильтрами UsernameFilter и PasswordFilter. В модели метаданных необходимо определить свойства SecondarySsoApplicationId и SsoProviderImplementation для LobSystemInstance и связать фильтры с соответствующими входными параметрами метода. Когда приложение Business Connectivity Services обнаруживает фильтры, оно использует свойства SecondarySsoApplicationId и SsoProviderImplementation в качестве идентификатора конечного приложения Secure Store и поставщика Secure Store соответственно.
<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>
Зададим для метода два фильтра.
<Method Name="GetEntity">
<FilterDescriptors>
<FilterDescriptor Type="Username" Name="UserNameFilter"/>
<FilterDescriptor Type="Password" Name="PasswordFilter"/>
</FilterDescriptors>
</Method>
Теперь, когда фильтры для метода заданы, можно перейти к следующему примеру, в котором показано, как связать фильтры с входными параметрами метода.
<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>
Это все, что необходимо для использования Secure Store в сборке подключения .NET. При выполнении метода приложением Business Connectivity Services оно считывает учетные данные из Secure Store и передает их методу через входные параметры.
Использование Secure Store в сборке подключения .NET с помощью кода
Перед написанием кода для использования Secure Store изучите, каким образом Business Connectivity Services использует Secure Store в других соединителях. В Business Connectivity Services другие соединители используют модель метаданных для получения необходимой информации о Secure Store и идентификаторе конечного приложения. Соединители используют эту информацию для получения учетных данных, необходимых для проверки подлинности во внешней системе. Например, для соединителя баз данных свойства 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 и считать учетные данные пользователя с помощью API-интерфейсов Secure Store.
Чтение свойств модели метаданных в сборке подключения .NET
Для считывания свойств модели метаданных в сборке подключения .NET в коде сборки .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 реализован интерфейс 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
Если в сборке подключения .NET необходимо считать из Secure Store один набор учетных данных, используйте следующие свойства.
ssoProviderImplementation — поставщик Secure Store
SecondarySsoApplicationId — конечное приложение для Secure Store
Свойства ssoProviderImplementation и SecondarySsoApplicationId поддерживаются для создания моделей соединителя сборки .NET в Microsoft SharePoint Designer 2010. Если в сборке подключения .NET необходимо считать из 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 возвращает для пользователя и идентификатора конечного приложения объект 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.
}
Сводка
В зависимости от конкретного сценария для использования Secure Store в сборке подключения .NET можно выбрать либо подход с использованием кода, либо подход без использования кода. В таблице 1 приведены различия между двумя подходами.
Таблица 1. Различия между подходом с использованием кода и подходом без использования кода
Область |
Подход без использования кода |
Подход с использованием кода |
---|---|---|
Необходимо взаимодействие с API-интерфейсом Secure Store |
Нет |
Да |
Характерно исключительно для соединителя сборки .NET |
Нет |
Да |
Поддержка SharePoint Designer |
Да |
Частично |
Требуется подпись метода |
Да |
Нет |
Возможность чтения данных из нескольких безопасных хранилищ |
Нет |
Да |
Возможность задания учетных данных на уровне LobSystemInstance |
Нет |
Да |