我有使用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调用服务时,我希望发生相同的“魔术”服务网址...有人知道怎么做吗?
答案 0 :(得分:3)
如果服务允许匿名请求,那么您可以匿名请求数据。否则,没有其他选择在代码/配置文件中提供您的用户名/密码。
另一个选择是您实现安全令牌。 (使用STS等) 或者,您当然可以省略将配置文件/ cs文件上传到包含安全信息的TFS。
答案 1 :(得分:0)
您正在使用Windows身份验证。您只需要允许WCF服务中的Impersonation
验证您正在服务的用户的身份。
WCF服务代码可以使用服务的安全标识(通常是主机进程标识或服务帐户的标识)或使用原始调用方的安全标识来进行调用。原始调用者可以是ASP.NET服务帐户,也可以是客户端应用程序的最终用户。只要下游代码需要根据原始呼叫者的身份进行授权,您就会模拟原始呼叫者。
在您的情况下,它是直接的ActiveDirectory / windows用户。
怎么做
我认为你已经涵盖了第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