短版:为什么当我冒充Windows应用商店提出的网页请求时,我会获得具有正确用户名的WindowsIdentity对象,但其IsAuthenticated属性返回False?从浏览器(包括Metro IE10)发出相同的请求会使IsAuthenticated == true。
长版:
我正在构建一个内部企业解决方案,它由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”。
我是否遗漏了某些内容或对企业身份验证功能抱有太多期待?
答案 0 :(得分:0)
我认为我遇到了同样的问题(Calling a WCF service using Windows Auth from a Windows Store App),看起来带有企业身份验证的Windows应用商店使用模拟阻止了对localhost上的服务的调用。
当我在域上的另一台服务器上托管我的服务时,它工作正常。