Revendications et Web Services avec SharePoint 2010 - Claims and Web Services with SharePoint 2010 BCS
Français | English | ||||||||||||||||
Ce billet montre l’appel d’un service Web utilisant une authentification à base de revendications via SharePoint 2010 BCS. Le web service est appelé par l’utilisation d’une liste externe. Le service web peut afficher dans ses traces les revendications qu’il reçoit. J’ai expliqué il y a un certain temps comment utiliser un service web en tant que source de données pour une liste externe. J’ai réutilisé le même principe avec quelques améliorations:
De façon à installer le service Web, je me suis inspiré d’un groupe de 4 pages de la librairie MSDN: WCF: Building WCF Web Services for SharePoint 2010 Business Connectivity Services Le rôle des machines est le suivant pour ce scénario:
Le service Web a le code suivant, qui utilise Windows Identity Foundation (WIF), de façon à afficher les revendications contenues dans le jeton SAML qu’il a reçu: |
This blog post is about calling a Web Service with claims based authentication thru SharePoint 2010 BCS. The web service is called by using an external list. The Web Service can show in its traces the claims it receives. I explained a while ago how to have SharePoint using a Web Service as a datasource for an external list. I reused the same principle with a few enhancements:
In order to install the Web Service, I leveraged a group of 4 MSDN library pages: WCF: Building WCF Web Services for SharePoint 2010 Business Connectivity Services The role of the machines is the following for this scenario:
|
public Customer[] GetAllCustomers()
{
Who();
var customers = (from entry in _customers select entry.Value).ToArray();
Trace.WriteLine(string.Format("GetAllCustomers will return {0} customers", customers.Length));
return customers;
}
…
public Customer UpdateCustomer(Customer customer)
{
Who();
Customer c;
lock (_customers)
{
c = _customers[customer.Id];
if (c == null) throw new ArgumentOutOfRangeException();
c.FirstName = customer.FirstName;
c.LastName = customer.LastName;
c.FirstContractDate = customer.FirstContractDate;
c.NbOfActiveContracts = customer.NbOfActiveContracts;
}
Trace.WriteLine(string.Format("UpdateCustomer updated customer {0}", c));
return c;
}
etc.
private void Who()
{
IPrincipal user = Thread.CurrentPrincipal;
if (user == null)
{
Trace.WriteLine(string.Format("current principal is null"));
}
else
{
Trace.WriteLine(string.Format("current user is of type {0}", user.GetType().Name));
IIdentity userIdentity = user.Identity;
if (userIdentity == null)
{
Trace.WriteLine(string.Format("current user's identity is null"));
}
else
{
Trace.WriteLine(string.Format("user's identity: {0} ({1}, {2})", userIdentity.Name, userIdentity.IsAuthenticated, userIdentity.AuthenticationType));
}
if (user is IClaimsPrincipal)
{
Trace.WriteLine(string.Format("user is a Claims user"));
IClaimsPrincipal claimsUser = (IClaimsPrincipal)user;
IClaimsIdentity claimsUserIdentity = (IClaimsIdentity)user.Identity;
foreach (var c in claimsUserIdentity.Claims)
{
Trace.WriteLine(string.Format("claim {0}={1}", c.ClaimType, c.Value));
}
}
}
Voyons maintenant ce que cela donne. Authentifions-nous avec Shibboleth sur la plateforme Windows: | Let’s check some test results now. Let’s authenticate thru Shibboleth on the Windows platform: |
Le service Web pourrait donc changer son comportement en fonction des revendications qu’il reçoit (au lieu de simplement tracer les noms et valeurs des revendications). Cela montre aussi qu’il n’y a pas de problème de double hop: l’utilisateur a été authentifié depuis le navigateur sur idmgt-win7 auprès du serveur SharePoint et son identité a été passée via les revendications au serveur idmgt-owa. Voyons un autre exemple avec Yahoo! | So the web service could change its behavior based on the claims it receives (instead of just tracing the claims names and values). This also shows that there is no double hop issue: the user was authenticated from idmgt-win7’s browser to idmgt-sps SharePoint server and his identity was then passed thru claims to the idmgt-owa server. Let’s see another example with Yahoo! |
Benjamin