Prise en charge des en-têtes HTTP et SOAP personnalisés
Remarque : le contenu dans cette rubrique s'applique à Microsoft Microsoft Office SharePoint Server 2007 SP1.
Grâce aux services Web, vous pouvez utiliser des en-têtes HTTP ou des en-têtes SOAP pour fournir des informations spécifiques à l'application sur le message SOAP ; par exemple, vous pouvez fournir des informations d'authentification et de paiement. Dans Microsoft Office SharePoint Server 2007 SP1, le catalogue de données métiers prend en charge les en-têtes HTTP et les en-têtes SOAP personnalisés pour passer aux appels de service Web les informations relatives au nom d'utilisateur et au mot de passe.
En-têtes HTTP
Le catalogue de données métiers peut envoyer le nom d'utilisateur et le mot de passe stockés dans les paramètres d’application du service d'authentification unique Microsoft sous la forme d’en-têtes aux appels de service Web. Les valeurs d'en-tête HTTP, autrement dit, le nom d'utilisateur et le mot de passe, sont codées en base 64. Par conséquent, dans le service Web, vous devez décoder les valeurs. Vous devez également utiliser SSL pour les services Web qui utilisent cette fonctionnalité, car les valeurs de mot de passe et de nom d'utilisateur ne sont pas chiffrées.
Pour utiliser des en-têtes HTTP, vous devez apporter les modifications suivantes dans le fichier de définition d'application :
Définissez la propriété SecondarySSOAppID de l'élément LobSystemInstance sur l'ID de l'application d'entreprise SSO dans Office SharePoint Server 2007 qui contient le nom d'utilisateur et le mot de passe.
Attribuez aux propriétés HttpHeaderUserName et HttpHeaderPassword de la méthode les noms d'en-tête respectifs attendus par le service Web.
Exemple
<LobSystemInstance Name="ContosoInstance" DefaultDisplayName="SimpleHTTPInstance">
<Properties>
<Property Name="LobSystemName" Type="System.String">Contoso</Property>
<Property Name="AuthenticationMode" Type="System.String">WindowsCredentials</Property>
…
…
<Property Name="SecondarySsoApplicationId" Type="System.String">Contoso</Property>
</Properties>
</LobSystemInstance>
<Method Name="HelloWorld" DefaultDisplayName="HelloWorld">
<Properties>
<Property Name="HttpHeaderUserName" Type="System.String">UserName</Property>
<Property Name="HttpHeaderPassword" Type="System.String">UserPassword</Property>
</Properties>
…
</Method>
En-têtes SOAP
Le catalogue de données métiers peut également envoyer le nom d'utilisateur et le mot de passe stockés dans les paramètres SSO en tant qu'en-têtes SOAP aux appels de service Web. Les valeurs d'en-tête SOAP (nom d'utilisateur et mot de passe) ne sont pas codées en base 64. Par conséquent, dans le service Web, vous pouvez lire les valeurs directement comme indiqué dans l'exemple suivant. Toutefois, vous devez utiliser SSL pour les services Web qui utilisent cette fonctionnalité, car les valeurs de mot de passe et de nom d'utilisateur ne sont pas chiffrées.
Pour utiliser des en-têtes SOAP, apportez les modifications suivantes dans le fichier de définition d'application :
Définissez la propriété SecondarySSOAppID de l'élément LobSystemInstance sur l'ID de l'application d'entreprise d'authentification unique dans Office SharePoint Server 2007 qui contient le nom d'utilisateur et mot de passe.
Définissez les propriétés suivantes de l'élément Method :
SoapHeaderUserNameMemberName: nom de l'en-tête SOAP de nom d'utilisateur que comprend le service Web.
SoapHeaderUserNameMemberFieldName: nom du champ qui contient le nom d'utilisateur.
SoapHeaderPasswordMemberName: nom de l'en-tête SOAP de mot de passe que comprend le service Web.
SoapHeaderPasswordMemberFieldName: nom du champ qui contient le mot de passe.
Notes
Le catalogue de données métiers prend également en charge la définition du nom d'utilisateur et du mot de passe dans un seul en-tête SOAP. Pour les en-têtes SOAP qui prennent en charge à la fois le nom d'utilisateur et le mot de passe, les valeurs de propriété de métadonnées SoapHeaderUserNameMemberName et SoapHeaderPasswordMemberNamesont les mêmes.
Exemple
<LobSystemInstance Name="ContosoInstance" DefaultDisplayName="SimpleSOAPInstance">
<Properties>
<Property Name="LobSystemName" Type="System.String">Contoso</Property>
<Property Name="AuthenticationMode" Type="System.String">WindowsCredentials</Property>
…
…
<Property Name="SecondarySsoApplicationId" Type="System.String">Contoso</Property>
</Properties>
</LobSystemInstance>
<Method Name="HelloWorld" DefaultDisplayName="HelloWorld">
<Properties>
<Property Name="SoapHeaderUserNameMemberName" Type="System.String">UserNameHeaderValue</Property>
<Property Name="SoapHeaderUserNameMemberFieldName" Type="System.String">MyValue</Property>
<Property Name="SoapHeaderPasswordMemberName" Type="System.String">UserPasswordHeaderValue</Property>
<Property Name="SoapHeaderPasswordMemberFieldName" Type="System.String">MyValue</Property>
</Properties>
…
</Method>
Important
Le serveur Web doit prendre en charge les en-têtes SOAP pour être en mesure de les utiliser. En outre, vous devez ajouter l'attribut SOAP à la méthode Web pour chaque en-tête SOAP. L'exemple de code suivant illustre cette opération.
public class Service : System.Web.Services.WebService
{
public UserNameHeader UserName;
public UserPasswordHeader Password;
public Service () { }
[WebMethod]
[SoapHeader("UserName", Direction=SoapHeaderDirection.In)]
[SoapHeader("Password", Direction=SoapHeaderDirection.In)]
public void HelloWorld()
{
string password = "";
string userName = "";
if (UserName != null)
{
userName = UserName.MyValue;
}
if (Password != null)
{
password = Password.MyValue;
}
return null;
}
}
public class UserNameHeader : SoapHeader
{
public string MyValue;
}
public class UserPasswordHeader : SoapHeader
{
public string MyValue;
}
Comme vous le savez, pour exécuter les méthodes Web, le catalogue de données métiers génère un proxy. Si la méthode Web principale prend en charge les en-têtes SOAP, le proxy qui est généré ressemble à l'exemple de code suivant.
Notes
L'exemple suivant montre uniquement le code pertinent.
public partial class Service : System.Web.Services.Protocols.SoapHttpClientProtocol
{
private UserPasswordHeader userPasswordHeaderValueField;
private UserNameHeader userNameHeaderValueField;
public Service() {}
public UserPasswordHeader UserPasswordHeaderValue
{
get { return this.userPasswordHeaderValueField; }
set { this.userPasswordHeaderValueField = value; }
}
public UserNameHeader UserNameHeaderValue
{
get { return this.userNameHeaderValueField; }
set { this.userNameHeaderValueField = value; }
}
public void HelloWorld()
{
object[] results = this.Invoke("HelloWorld", new object[0]);
return (results[0]);
}
}
public partial class UserPasswordHeader : System.Web.Services.Protocols.SoapHeader
{
private string myValueField;
public string MyValue
{
get { return this.myValueField; }
set { this.myValueField = value; }
}
}
public partial class UserNameHeader : System.Web.Services.Protocols.SoapHeader
{
private string myValueField;
public string MyValue
{
get { return this.myValueField; }
set { this.myValueField = value; }
}
}