调用WCF安全请求,而不在我的代码中指定我的凭据

时间:2014-02-20 14:03:59

标签: c# wcf windows-authentication

我有使用Windows身份验证的REST WCF服务。

 <service name="MyService">
    <endpoint address="" binding="wsHttpBinding" bindingConfiguration="wsHttp_Reliable" contract="ISomeService">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
    <endpoint address="web" behaviorConfiguration="restBehavior" binding="webHttpBinding" bindingConfiguration="web_authenticate_binding" name="computersWebEndpoint" contract="ISomeService" />
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />

  </service>

并且web_authenticate_binding是:

 <binding name="web_authenticate_binding" maxReceivedMessageSize="2147483647">
      <security mode ="TransportCredentialOnly">
        <transport clientCredentialType ="Windows"/>
      </security>
      <readerQuotas maxDepth="128" maxStringContentLength="2147483647" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
      <!--<security mode="TransportCredentialOnly">
        <transport clientCredentialType="Windows"></transport>
      </security>-->
    </binding>

现在我想从服务URL调用javascript服务而不在代码中显式写入我的凭据(如果我需要在弹出窗口中填写它,就像我在浏览器中写入url一样好了.. )。

有办法吗?

当通过添加服务引用以“soap”方式调用服务时,它甚至不会询问我的凭据......当我在ajax调用中使用javascript调用服务时,我希望发生相同的“魔术”服务网址...有人知道怎么做吗?

2 个答案:

答案 0 :(得分:3)

如果服务允许匿名请求,那么您可以匿名请求数据。否则,没有其他选择在代码/配置文件中提供您的用户名/密码。

另一个选择是您实现安全令牌。 (使用STS等) 或者,您当然可以省略将配置文件/ cs文件上传到包含安全信息的TFS。

答案 1 :(得分:0)

您正在使用Windows身份验证。您只需要允许WCF服务中的Impersonation验证您正在服务的用户的身份。

WCF服务代码可以使用服务的安全标识(通常是主机进程标识或服务帐户的标识)或使用原始调用方的安全标识来进行调用。原始调用者可以是ASP.NET服务帐户,也可以是客户端应用程序的最终用户。只要下游代码需要根据原始呼叫者的身份进行授权,您就会模拟原始呼叫者。

在您的情况下,它是直接的ActiveDirectory / windows用户。

怎么做

  • 步骤1:创建示例WCF服务
  • 步骤2:配置WCF服务以使用Windows身份验证
  • 步骤3:为WCF服务端点配置SPN标识
  • 步骤4:在WCF服务中实施模拟
  • 步骤5:创建Web应用程序测试客户端
  • 步骤6:向客户端添加WCF服务引用
  • 步骤7:在调用WCF服务时模拟原始呼叫者
  • 步骤8:为受约束的委派配置Web应用程序
  • 步骤9:测试客户端和WCF服务

我认为你已经涵盖了第1步&amp;第2步。

对于第3步:

将服务的Web配置修改为:

  • 设置binding="wsHttpBinding"
  • 在标识部分,设置servicePrincipalName value = HOST/<YourMachineName>&amp; dns value=""而不是localhost。例如:

    ...                                                           ...

步骤4:在WCF服务中实施模拟

  • System.Security.Principal命名空间添加using语句。

  • 设置操作实现所需的模拟 具体操作如下:

    [OperationBehavior(Impersonation = ImpersonationOption.Required)] public string OpertaionFunction(int value) { ... }

第5步是测试,所以我正在跳过它。

步骤6:向客户端添加WCF服务参考

  • 右键单击您的客户端项目,然后单击“添加服务引用”。

步骤7:在调用WCF服务时模拟原始呼叫者

  • System.Security.Principle命名空间添加using语句。

  • 使用Impersonate()方法模拟原始调用方。 像:

    using System.Security.Principal; protected void YourOperation() { // Obtain the authenticated user's Identity and impersonate the original caller using (((WindowsIdentity)HttpContext.Current.User.Identity).Impersonate()) { WCFTestService.ServiceClient myService = new WCFTestService.ServiceClient(); Response.Write(myService.GetData(123) + "<br/>"); myService.Close(); } }

步骤为受限制委派配置Web应用程序

  • 启动Microsoft管理控制台(MMC)Active Directory用户 和计算机管理单元。

  • 在MMC管理单元的左窗格中,单击“计算机”节点。

  • 在右窗格中,双击要显示的Web服务器计算机 “属性”对话框。

  • 在Web服务器的“属性”窗口的“委派”选项卡上 计算机,不信任计算机的委派选择 默认。要使用约束委派,请选择“信任此计算机” 仅限委托给指定的服务。

  • 您可以准确指定可以访问的服务 底部窗格。信任此计算机以便委派 仅指定服务,请选择仅使用Kerberos。

  • 点击添加。

  • 将出现“添加服务”对话框。 单击用户或计算机。

  • 在“选择用户或计算机”对话框中,键入您的名称 如果您使用网络服务运行WCF服务计算机。 或者,如果您使用自定义域运行WCF 帐户,请输入该帐户名称。单击“确定”。

  • 您将看到为所选用户或所配置的所有SPN 电脑帐户。要限制对WCF服务的访问,请选择 HOST服务,然后单击“确定”。

请参阅:How to: Impersonate the Original Caller in WCF Calling from a Web Application了解更多详情。

评论更新

你可以使用ajax调用从javascript(jQuery)调用你的wcf服务,如:

$.ajax({
            type: "POST",//default GET, if you wish leave you can also use GET
            url: "http://localhost/Service.svc/ServiceMethod",
            data: JSON.stringify(AnyJsonInput),
            contentType: 'application/json; charset=utf-8',
            dataType: "json",
            success: function(){//on success},
            error: function(){console.log('error in service')}
        });

注意:完成上述步骤Impersonation后,在IE中,它会自动获取用户登录的Windows凭据。对于其他浏览器,您不需要做任何事情,它会自动询问用户名&amp;密码。

总结一下我们所做的就是自动传递Windows凭据以进行授权服务。一件重要的事情是您的网站也必须使用impersonation