2

簡短版本:爲什麼當我模擬由Windows應用商店提出的Web請求時,我使用正確的用戶名獲取WindowsIdentity對象,但其IsAuthenticated屬性返回False?從瀏覽器(包括Metro IE10)發出相同的請求給了IsAuthenticated == true。Windows企業應用程序與企業身份驗證和冒充

長的版本
我原型內部的企業解決方案,其中包括WCF服務和WinJS應用。 WCF服務基於webHttpBinding(即簡單的GET/POST請求)。

某些操作需要代表發出請求的用戶進行處理,因此服務配置爲模擬其調用者。下面是示例配置:

<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> 

...和代碼:

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; 
    } 
} 

因此,這種操作簡單的收集有關來電者信息和JSON字符串並將其返回。

搬到客戶端。要啓用自動身份驗證,我在Windows應用商店應用的清單文件中選中了「企業身份驗證」,「Internet(客戶端)」和「專用網絡」。

從Windows應用商店的應用程序中,我使用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>"; 
    }); 

現在,當我執行的Windows商店應用,並將其發送請求時,我得到的迴應是:

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

如果我使用瀏覽器的地址欄發送請求,我會得到相同的響應,唯一區別是「IsAuthenticated:true」。

我也注意到,如果我禁用「企業認證」,它會導致憑證選取器彈出,並提供正確的憑據後,我得到「IsAuthenticated:true」。

我是否錯過了某些東西或期望從企業身份驗證功能中獲得太多?

回答