Windows应用商店的应用程序与enterpriseAuthentication和模拟(Windo

2019-08-03 10:44发布

短版本 :为什么当我扮演的Windows商店应用的web请求,我得到正确的用户名WindowsIdentity对象,但其IsAuthenticated属性返回false? 从浏览器(包括地铁IE10)做出同样的要求给IsAuthenticated ==真。

龙版本
我在原型内部的企业解决方案,其中包括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应用商店应用程序的清单文件,检查“企业认证”,“互联网(客户端)”和“专用网络”。

从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:真”。

我也注意到,如果我禁用“企业认证”,它会导致凭据选择器弹出,并提供正确的凭据之后,我的“IsAuthenticated:真”。

我缺少的东西,或从enterpriseAuthentication能力寄予太大期望?

Answer 1:

我想我已经在同样的跌跌撞撞( 呼叫使用Windows身份验证从Windows Store应用的WCF服务 ),它看起来像与企业身份验证的Windows Store的应用程式防止使用模拟本地主机上调用服务。

当我主持的域另一台服务器上我的服务它的工作就好了。



文章来源: Windows Store app with enterpriseAuthentication and Impersonation