簡短版本:爲什麼當我模擬由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」。
我是否錯過了某些東西或期望從企業身份驗證功能中獲得太多?