Frage

Ich habe einige Probleme, einen sicheren WCF-Datendienst Schreiben von Power verbraucht werden. Der Service funktioniert gut, und ich kann die Daten in Power ohne Probleme konsumieren.

Mein Problem ist, dass, wenn ich den Benutzer-ID und das Kennwort für den Datenfeed in Power (in Data Feed erweiterten Einstellungen) eingeben, kann ich keinen Zugriff auf sich aus dem Innern des WCF-Dienst zu bekommen scheint. Ich mag sowohl den Benutzer-ID und das Passwort zum Authentifizieren mit einer Datenbank verwenden, aber ich muß zuerst bei ihnen bekommen. :)

Gibt es gute Beispiele dafür, wie einen sicheren WCF Data Service speziell für Power zu schreiben?

Vielen Dank.

War es hilfreich?

Lösung

ich mit dieser gleichen Sache zu kämpfen habe, und nach einigen Recherchen fand diese Blog-Post, die hat ich rollen:

http://pfelix.wordpress.com/2011/04/21/wcf-web-api-self-hosting-https-and-http-basic-authentication/

Kurz gesagt, gibt es einige Arbeit, die Sie tun müssen, um die Auftraggeber zu ermöglichen, den Service-Aufruf zu fließen.

Andere Tipps

Es gibt eine voll herunterladbare Probe auf MSDN

WCF Data Service mit Standardauthentifizierung für Power Kunden

https://code.msdn.microsoft.com / Büro / WCF-Datendienst-mit-547e9341

Update

Okay, jetzt habe ich den Code in der Schnittstelle verwendet wird (dass ich zu der Zeit erforschte ich geschrieben) Ich weiß, dass es funktioniert, also hier ist das Code-Beispiel:

Schritt 1:. Schreiben Sie einen HTTP-Handler alle Anfragen bearbeiten und die Authentifizierung (oder Ausgabe einer 401 challenge) durchführen

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

Schritt 2:. Konfigurieren Sie Ihren neuen Handler mit IIS über web.config

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

Wichtig für Excel Power

Sehen Sie diesen Fehler: Power Authorization-Header in Standardauthentifizierung OData Svc nicht

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top