Compartilhar via


Walkthrough: Implementando um provedor de SSO Pluggable

Microsoft Office do SharePoint Server 2007 Por padrão, fornece o Microsoft Single Sign - on (SSO) serviço de armazenamento e mapeamento de credenciais para uso na conexão com outra - parte ou sistemas back-end. Muitas empresas já tem desenvolvido um sistema armazenamento credencial internamente ou usam uma solução Other Than o serviço Microsoft Single Sign-On. Como um alternativo para manutenção mapeamento credencial em dois locais, O Office SharePoint Server 2007 fornece um mecanismo chamado conectável SSO. Esse recurso permite que você especificar um alternativo provedor SSO para o padrão provedor SSO em O Office SharePoint Server 2007.

Pré-requisitos

Antes de compilar o provedor de SSO, você deve configurar seu ambiente. Esta explicação passo a passo supõe que você tenha configurado O Office SharePoint Server 2007, instalado um copiar de banco de dados o AdventureWorks 2000 das Centro de Download Microsoft e ter garantiu que o nome domínio é LITWAREINC. Se você estiver usando um nome diferente domínio, você deve ajustar os exemplos codificar este explicação passo a passo.

As contas domínio e os grupos mostrados na seguinte tabela são considerados presente.

ExternalPartners

Grupo de domínio

InternalSales

Grupo de domínio

Tom Tompson

Usuário de domínio

Jerry Jones

Usuário de domínio

InternalAccess

Usuário de domínio

ExternalAccess

Usuário de domínio

Completo para obter instruções sobre como configurar a banco de dados e contas necessários usuário, consulte o arquivo README.txt fornecido com o banco de dados AdventureWorks 2000.

Implementando um provedor Single Sign-on

Substituir o provedor de SSO usar como padrão em O Office SharePoint Server 2007 envolve a implementação de Microsoft.SharePoint.Portal.SingleSignon.ISsoProvider**** interface, instalando-lo para o cache global de assemblies e registrando o novo provedor de SSO com O Office SharePoint Server 2007.

Você pode registrar somente um provedor de SSO para O Office SharePoint Server 2007. Registrar um novo provedor de SSO substitui o usar como padrão SpsSsoProvider ossossshort O Office SharePoint Server 2007 T:Microsoft.SharePoint.Portal.SingleSignon.SpsSsoProvider. Como somente um provedor de SSO pode estar em uso em um tempo, é recomendável você parar o serviço Microsoft Single Sign-On ao usar um provedor de SSO personalizado.

You will need to implement the GetCredentials and GetSsoProviderInfo methods of the ISsoProvider interface to create a minimally functional SSO provider. Esta explicação passo a passo mostra como criar um provedor de SSO simples e usá-lo para acessar dados por meio de Business Data Catalog.

Neste explicação passo a passo, nosso personalizado provedor SSO mapeia usuários que fazem parte de GRUPO InternalSales para conta de usuário o InternalAccess para recuperar dados do produto a partir de banco de dados AdventureWorks 2000.

Criando o provedor

Esta seção mostra como para compilar e registrar um provedor de SSO simples, e descreve manipulação de exceção para o provedor.

SharePoint Server 2007: Software Development Kit Downloads para baixar o provedor exemplo, consulte .

Exemplo

Você cria um assembly provedor SSO em Microsoft Visual Studio 2005 criando um projeto de biblioteca de classes. Adicione uma referência para o Microsoft.SharePoint.Portal.SingleSignon.dll (encontrada no Diretório %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\12\ISAPI %ProgramFiles%\Arquivos Files\Microsoft Shared\web servidor extensions\12\ISAPI) para seu projeto. Implementar a interface ISsoProvider T:Microsoft.SharePoint.Portal.SingleSignon.ISsoProvider, conforme o seguinte exemplo.

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();
        }
    }
}

At a minimum, you must implement the GetCredentials and GetSsoProviderInfo methods. O SimpleSSOProvider classe que criamos retorna novas credenciais com base na atual usuário e o identificador aplicativo ( AppID) é fornecido. É possível obter informações sobre o atual usuário usando o CurrentPrincipal property do segmento que está executando em ( System.Threading.Thread.CurrentPrincipal). O seguinte codificar mostra a implementação do GetCredentials método M:Microsoft.SharePoint.Portal.SingleSignon.ISsoProvider.GetCredentials(System.String).

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);
    }
}

A implementação SsoProvider não requer SsoCredentialsContents, mas certos outros aplicativos cliente esperava SsoCredentialsContents. De exemplo fornecido, Serviços do Excel tentará conectar aos recursos com um logon Windows usando o UserName e Password que foram definidos. Se nenhum valor foi fornecido para WindowsCredentials, o UserName e Password poderiam ser definidas na seqüência de conexão.

Nome Descrição

Nenhum

Nenhuma evidência fornecida.

UserName

Defina se UserName existe.

Password

Defina se Password existe.

Evidence

Defina se usando estendido campos (até cinco total, incluindo UserName e Password)

MappedGroup

Defina se definição de aplicativo é um Group definição de grupo.

WindowsCredentials

Defina se definição de aplicativo é Autenticação do Windows.

O GetSsoProviderInfo M:Microsoft.SharePoint.Portal.SingleSignon.ISsoProvider.GetSsoProviderInfo método simplesmente retorna informações sobre o provedor, such as o nome do fornecedor e versão, conforme o seguinte codificar.

        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;
        }

Se o provedor de SSO será consumida por Serviços do Excel, você também deve fornecer uma implementação para os métodos M:Microsoft.SharePoint.Portal.SingleSignon.ISsoProvider.GetTicket GetCredentialsUsingTicket e GetTicket.

O SimpleSsoProvider classe que criamos mostra um exemplo muito simples de um provedor de SSO. Uma implementação real-life deve recuperar credenciais de um Seguro repositório e proteger quaisquer valores enquanto eles são armazenados na memória.

O objeto SsoCredentials T:Microsoft.SharePoint.Portal.SingleSignon.SsoCredentials retornado por GetCredentials a SecureString SecureString classe usa para armazenar o UserName e Password senha propriedades, bem como todos os valores Evidence provas. SecureString criptografa seus dados para que ele não pode ser decifrado facilmente.

Manipulação de exceção

Our SimpleSSOProvider throws an instance of SingleSignonException and uses standard SSOReturnCodes fields if it cannot properly determine the AppID. A seguinte tabela mostra alguns comum SSOReturnCodes campos para diversos casos de erro.

Nome Descrição

SSO_E_ACCESSDENIED

Acesso negado.

SSO_E_CREDS_NOT_FOUND

Credenciais não foi encontradas para o usuário solicitado ou aplicativo.

SSO_E_SSO_NOT_CONFIGURED

O serviço provedor o SSO não está configurado corretamente.

SSO_E_APPLICATION_NOT_FOUND

O definição de aplicativo não pode ser encontrado.

SSO_E_EXCEPTION

O serviço provedor SSO apresentou uma exceção.

Registrando o provedor

Para instalar o SimpleSSOProvider, você deve registrá-lo na cache global de assemblies e, em seguida, registrar com o aplicativo de console ProviderAdmin (localizada no Diretório bin da instalação O Office SharePoint Server 2007 ossossshort). O aplicativo ProviderAdmin substitui o atual provedor o SSO com a você especificar. No ambiente farm servidor, você deve registrar o novo provedor o SSO com cada computador no farm. O seguinte apresentação procedimentos você como para registrar o provedor e como remover um personalizado provedor e reinstate o original.

Para registrar a SimpleSSOProvider

  • A ferramenta ProviderAdmin leva o nome assembly totalmente qualificado e o nome da classe que implementa a interface ISsoProvider T:Microsoft.SharePoint.Portal.SingleSignon.ISsoProvider. Para registrar o SimpleSSOProvider em nosso exemplo, a ferramenta ProviderAdmin executa o seguinte comando.

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

Para remover um provedor de SSO personalizado e reinstate o original provedor SSO

  • Para remover um provedor de SSO personalizado e reinstate o original provedor SSO em O Office SharePoint Server 2007, cancelar o registro o provedor de SSO usando o seguinte comando.

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

Acessando o provedor Single Sign-on

Web Parts ou outros componentes que precisam acessar para um provedor de SSO não devem usar o objeto Credentials T:Microsoft.SharePoint.Portal.SingleSignon.Credentials. Usar o objeto Credentials T:Microsoft.SharePoint.Portal.SingleSignon.Credentials recupera somente o provedor de SSO usar como padrão incluído O Office SharePoint Server 2007, mesmo se você registrou um novo provedor usando a ferramenta ProviderAdmin. Para obter uma referência para o atualmente registrado ISsoProvider, use o seguinte procedimento.

Para obter uma referência para o provedor de SSO atualmente registrado

  • Use the GetSsoProvider method on the SsoProviderFactory class to obtain a reference to the currently registered ISsoProvider. Seu codificar pode usar o GetCredentials M:Microsoft.SharePoint.Portal.SingleSignon.ISsoProvider.GetCredentials(System.String) método sobre a interface ISsoProvider T:Microsoft.SharePoint.Portal.SingleSignon.ISsoProvider para obter credenciais aplicativo, da seguinte maneira.

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

O SsoCredentials T:Microsoft.SharePoint.Portal.SingleSignon.SsoCredentials classe fornece acessar para credenciais by Way of o SecureString SecureString classe. Você pode usar um número dos diferentes métodos para converter um SecureString SecureString instância para um formato utilizável, such as o SecureStringToBSTR SecureStringToBSTR, conforme o seguinte exemplo.

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);
}
}

Usando o provedor Single Sign-on a partir de Catálogo de dados Business

In addition to a acessar você tiver de Web Parts para o usar como padrão o SSO provedor, você também pode usar seu personalizado SSO provedor a partir de aplicativos Business Data Catalog registrados.

Para usar o provedor de SSO personalizado com o Business Data Catalog

  • Para usar o provedor de SSO personalizado com uma linha banco de dados - de - sistema empresa (LOB), modifique a esquema Business Data Catalog para adicionar o SsoApplicationId e SsoProviderImplementation propriedades para o LOBSystemInstance LOBSystemInstance XML marca, como segue.

    <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>
    

Porque nossa provedor retorna Windows credenciais, o AuthenticationMode AuthenticationMode propriedade está configurado para receber WindowsCredentials. Quando Business Data Catalog recupera credenciais do provedor de SSO, ele irá executar um LogonUser() chamar para configurar representação prior to tentando obter acessar para o banco de dados.

Em nosso exemplo, um usuário está mapeado para o InternalAccess ou ExternalAccess contas para recuperar dados do produto de um banco de dados AdventureWorks 2000.

Para obter mais informações sobre esquema Business Data Catalog, incluindo a configuração necessária para implementar o SSO para serviço da Web de aplicativos LOB sistemas, consulte LobSystemInstance no Modelo de Metadados Catálogo de dados comerciais:.

Próxima etapas

A capacidade substituir o provedor de SSO O Office SharePoint Server 2007 permite que você melhor integrar seus sites SharePoint os investimentos já feitos em sua corporação. Você pode fazer uso de credencial preexistente armazena desenvolvido internamente ou fornecido como parte de um terceiro-parte pacote. Seu personalizado provedor, em seguida, pode ser acessado de objetos Web Parts ou Business Data Catalog para aproveitar o SSO provedor personalizado.