Windows Store-App mit EnterpriseAuthentication und Identitätswechsel

Kurze Version: Warum erhalte ich beim Identitätswechsel einer von der Windows Store-App gestellten Webanforderung ein WindowsIdentity-Objekt mit dem richtigen Benutzernamen, dessen IsAuthenticated-Eigenschaft jedoch False zurückgibt? Wenn Sie die gleiche Anfrage von einem Browser (einschließlich Metro IE10) stellen, erhalten Sie IsAuthenticated == true.

Lange Version:
Ich erstelle einen Prototyp für eine interne Unternehmenslösung, die aus einem WCF-Dienst und einer WinJS-Anwendung besteht. Der WCF-Dienst basiert auf dem webHttpBinding (d. H. Einfachen GET / POST-Anforderungen).

Bestimmte Aktionen müssen im Auftrag eines Benutzers ausgeführt werden, der eine Anfrage stellt. Daher ist der Dienst so konfiguriert, dass er die Identität seiner Anrufer annimmt. Hier ist eine Beispielkonfiguration:

<system.serviceModel>
  <bindings>
    <webHttpBinding>
      <binding name="CustomizedWebBinding">
        <security mode="TransportCredentialOnly">
          <transport clientCredentialType="Windows" />
        </security>
      </binding>
    </webHttpBinding>
  </bindings>
    <behaviors>
      <endpointBehaviors>
        <behavior name="Web">
          <webHttp/>
        </behavior>
      </endpointBehaviors>
        <serviceBehaviors>
            <behavior name="">
                <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
                <serviceDebug includeExceptionDetailInFaults="false" />
            </behavior>
        </serviceBehaviors>
    </behaviors>
    <services>
        <service name="WcfService">
            <endpoint address="" binding="webHttpBinding" bindingConfiguration="CustomizedWebBinding" contract="IWcfService" behaviorConfiguration="Web">
                <identity>
                    <dns value="localhost" />
                </identity>
            </endpoint>
            <host>
                <baseAddresses>
                    <add baseAddress="http://localhost:8787/" />
                </baseAddresses>
            </host>
        </service>
    </services>
</system.serviceModel>

... und Code:

public class WcfService : IWcfService
{
    [OperationBehavior(Impersonation=ImpersonationOption.Required)]
    public UserInfo GetUserInfo()
    {
        UserInfo ui = new UserInfo();
        WindowsIdentity identity = ServiceSecurityContext.Current.WindowsIdentity;

        ui.UserName = identity.Name;
        ui.IsAuthenticated = identity.IsAuthenticated;
        ui.ImpersonationLevel = identity.ImpersonationLevel.ToString();
        ui.IsAnonymous = identity.IsAnonymous;
        ui.IsGuest = identity.IsGuest;
        ui.IsSystem = identity.IsSystem;
        ui.AuthenticationType = identity.AuthenticationType;

        return ui;
    }
}

Diese Operation sammelt also einfach Informationen über den Anrufer und sendet sie in einer JSON-Zeichenfolge zurück.

Umzug auf den Kunden. Um die automatische Authentifizierung zu aktivieren, habe ich in der Manifestdatei der Windows Store-App "Enterprise-Authentifizierung", "Internet (Client)" und "Private Netzwerke" aktiviert.

In der Windows Store-App sende ich eine Anfrage mit der Funktion WinJS.xhr:

    var options = {
        url: "http://localhost:8787/getuserinfo"
    };

    WinJS.xhr(options).then(function (xhrResponse) {
        var userInfoBlock = document.getElementById("userInfoBlock");
        var data = JSON.parse(xhrResponse.response);

        userInfoBlock.innerHTML += "<ul>"

        for (var p in data) {
            if (data.hasOwnProperty(p)) {
                userInfoBlock.innerHTML += "<li>" + p + ": " + data[p] + "</li>";
            }
        }

        userInfoBlock.innerHTML += "</ul>";
    });

Wenn ich jetzt die Windows Store-App ausführe und sie eine Anforderung sendet, erhalte ich folgende Antwort:

AuthenticationType: "NTLM"
ImpersonationLevel: "Impersonation"
IsAnonymous: false
IsAuthenticated: false
IsGuest: false
IsSystem: false
UserName: "TESTBOX\dev"

Wenn ich eine Anfrage über die Adressleiste des Browsers sende, erhalte ich dieselbe Antwort, mit dem einzigen Unterschied, dass "IsAuthenticated: true".

Ich habe auch festgestellt, dass beim Deaktivieren von "Enterprise Authentication" die Auswahl der Anmeldeinformationen aktiviert wird und nach der Eingabe der korrekten Anmeldeinformationen "IsAuthenticated: true" angezeigt wird.

Vermisse ich etwas oder erwarte ich zu viel von der EnterpriseAuthentication-Funktion?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage