2010-12-15 90 views
3

Je rencontre des problèmes lors de l'écriture d'un service de données WCF sécurisé devant être utilisé par PowerPivot. Le service fonctionne correctement et je peux consommer les données dans PowerPivot sans problème. Mon problème est que lorsque je saisis l'ID utilisateur et le mot de passe pour le flux de données dans PowerPivot (dans les paramètres avancés du flux de données), je n'arrive pas à y accéder à partir du service WCF. J'aimerais utiliser à la fois l'ID utilisateur et le mot de passe pour m'authentifier auprès d'une base de données, mais je dois d'abord les consulter. :)Ecriture d'un service de données WCF sécurisé pour Excel PowerPivot

Existe-t-il de bons exemples d'écriture d'un service de données WCF sécurisé spécifiquement pour PowerPivot?

Merci beaucoup.

Répondre

-1

Il y a un échantillon téléchargeable complet sur MSDN

WCF Data Service avec l'authentification de base pour les clients PowerPivot

https://code.msdn.microsoft.com/office/WCF-Data-Service-with-547e9341

Mise à jour

Ok, maintenant j'ai utilisé le code dans le lien (que je recherchais au moment où j'ai posté) Je sais que cela fonctionne, donc voici l'exemple de code:

Étape 1: écrire un gestionnaire HTTP pour gérer toutes les demandes et effectuer l'authentification (ou l'émission d'un défi 401).

namespace WebHostBasicAuth.Modules 
{ 
    public class BasicAuthHttpModule : IHttpModule 
    { 
     private const string Realm = "My Realm"; 

     public void Init(HttpApplication context) 
     { 
      // Register event handlers 
      context.AuthenticateRequest += OnApplicationAuthenticateRequest; 
      context.EndRequest += OnApplicationEndRequest; 
     } 

     private static void SetPrincipal(IPrincipal principal) 
     { 
      Thread.CurrentPrincipal = principal; 
      if (HttpContext.Current != null) 
      { 
       HttpContext.Current.User = principal; 
      } 
     } 

     // TODO: Here is where you would validate the username and password. 
     private static bool CheckPassword(string username, string password) 
     { 
      return username == "user" && password == "password"; 
     } 

     private static void AuthenticateUser(string credentials) 
     { 
      try 
      { 
       var encoding = Encoding.GetEncoding("iso-8859-1"); 
       credentials = encoding.GetString(Convert.FromBase64String(credentials)); 

       int separator = credentials.IndexOf(':'); 
       string name = credentials.Substring(0, separator); 
       string password = credentials.Substring(separator + 1); 

       if (CheckPassword(name, password)) 
       { 
        var identity = new GenericIdentity(name); 
        SetPrincipal(new GenericPrincipal(identity, null)); 
       } 
       else 
       { 
        // Invalid username or password. 
        HttpContext.Current.Response.StatusCode = 401; 
       } 
      } 
      catch (FormatException) 
      { 
       // Credentials were not formatted correctly. 
       HttpContext.Current.Response.StatusCode = 401; 
      } 
     } 

     private static void OnApplicationAuthenticateRequest(object sender, EventArgs e) 
     { 
      var request = HttpContext.Current.Request; 
      var authHeader = request.Headers["Authorization"]; 
      if (authHeader != null) 
      { 
       var authHeaderVal = AuthenticationHeaderValue.Parse(authHeader); 

       // RFC 2617 sec 1.2, "scheme" name is case-insensitive 
       if (authHeaderVal.Scheme.Equals("basic", 
         StringComparison.OrdinalIgnoreCase) && 
        authHeaderVal.Parameter != null) 
       { 
        AuthenticateUser(authHeaderVal.Parameter); 
       } 
      } 
     } 

     // If the request was unauthorized, add the WWW-Authenticate header 
     // to the response. 
     private static void OnApplicationEndRequest(object sender, EventArgs e) 
     { 
      var response = HttpContext.Current.Response; 
      if (response.StatusCode == 401) 
      { 
       response.Headers.Add("WWW-Authenticate", 
        string.Format("Basic realm=\"{0}\"", Realm)); 
      } 
     } 

     public void Dispose() 
     { 
     } 
    } 
} 

Étape 2: Configurez votre nouveau gestionnaire avec IIS via votre web.config.

<system.webServer> 
    <modules> 
     <add name="BasicAuthHttpModule" 
     type="WebHostBasicAuth.Modules.BasicAuthHttpModule, YourAssemblyName"/> 
    </modules> 
    ... 

Important pour Excel PowerPivot

Voir ce bug: PowerPivot not sending Authorization header in Basic Authentication to OData Svc

+0

Bien que ce lien puisse répondre à la question, il est préférable d'inclure les parties essentielles de la réponse [ici] (http://meta.stackoverflow.com/a/8259) et de fournir le lien pour référence. Les réponses à lien uniquement peuvent devenir invalides si la page liée change. – bummi

+0

Vous avez raison, et je fais habituellement un meilleur travail, mais j'étais au lit sur mon téléphone. J'ai pensé qu'un lien vers un «bon exemple», comme OP l'a demandé, est meilleur que rien du tout. –