Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用ADAM(AD LDS)验证来自Silverlight的WCF呼叫_Wcf_Silverlight_Authentication_Ssl_Adam - Fatal编程技术网

使用ADAM(AD LDS)验证来自Silverlight的WCF呼叫

使用ADAM(AD LDS)验证来自Silverlight的WCF呼叫,wcf,silverlight,authentication,ssl,adam,Wcf,Silverlight,Authentication,Ssl,Adam,我有一个Silverlight 4客户端,它调用多个WCF服务。我们希望使用SSL对通信进行加密,我已经解决了这一部分,并且每个调用都要针对AD LDS ADAM进行身份验证,您是否有任何简单的示例来说明如何实现这一点?有很多关于WCF选项的文档,但是我还没有找到一个简单的工作示例,但是我认为非常常见的场景是SSL加密+ADAM身份验证+Silverlight。非常感谢您的帮助或指点。您可以在WCF中使用CustomUserNameValidator: 在自定义验证器的验证方法中,您可以查询A

我有一个Silverlight 4客户端,它调用多个WCF服务。我们希望使用SSL对通信进行加密,我已经解决了这一部分,并且每个调用都要针对AD LDS ADAM进行身份验证,您是否有任何简单的示例来说明如何实现这一点?有很多关于WCF选项的文档,但是我还没有找到一个简单的工作示例,但是我认为非常常见的场景是SSL加密+ADAM身份验证+Silverlight。非常感谢您的帮助或指点。

您可以在WCF中使用CustomUserNameValidator:

在自定义验证器的验证方法中,您可以查询ADAM来验证用户


尊敬。

在Codeplex网站上尝试此链接,它似乎是您所描述场景的设置和配置。它提供了所有所需设置的完整清单:

如果这不是您的确切情况,请查看以下部分以填补空白:


答案可能取决于您将如何处理许可,因为您使用ASP.net的成员资格提供程序来实现这些功能

如果您希望基于声明的授权,ADFS 1.0而不是2.0支持ADAM。如果你想要一个有更多选择的STS,试试codplex's

如果要使用基于角色的管理,请尝试Microsoft p&p中的企业库,或直接访问以前称为AzMan的COM

我更喜欢并使用基于索赔的方法:

使用ActiveDirectory+ADFS 2.0 为什么不使用AD?的内置容错和复制功能,ADAM是一个难题 Silverlight对Ws-Trust的实现,如下所述:
埃德加,我也对你得到的任何结果感兴趣,我和你在同一个地方

Shoaib,我已经看过了,但我认为它不如通过ActiveDirectoryMembershipProvider只使用.config那么理想,因为那时您只是使用现成的组件,而不是编写自己的安全系统

编辑: 我希望这对某人有帮助。我不敢相信在互联网上没有这样的好例子。这很简单。正如我之前所说的,这比使用自定义身份验证系统要好

使用AD LDS ADAM身份验证与Silverlight兼容的WCF调用非wsHttp

客户端:

1来自Silverlight的调用如下所示,如果您也在使用通道工厂,则此功能也可以工作

var client = new MyWCFServiceClient();
client.GetPersonCompleted += client_GetPersonCompleted;
client.ClientCredentials.UserName.UserName = username;
client.ClientCredentials.UserName.Password = password;
client.GetPersonAsync();
2如果登录失败,服务器返回的值将具有错误属性。如果用户查找失败,则会出现类似“至少一个安全令牌无法验证”这样的混淆错误。由于服务器端代码无法重新包装,因为这一切都发生在web.config中,因此客户端代码最好捕获System.ServiceModel.Security.MessageSecurityException并将其解释为登录失败,或者检查InnerException消息以确保它是安全令牌

void client_GetPersonCompleted(object sender, GetPersonCompletedEventArgs e)
{
if (e.Error == null)
{
     // do stuff with e.Result;
}
if (e.Error is MessageSecurityException)
{
    // Your login did not work
}
}
服务器端:

1 WCF服务类必须具有 [AspNetCompatibilityRequirementsRequirementsMode=AspNetCompatibilityRequirementsMode.Allowed]或必需

2您必须在启用SSL的情况下设置LDS实例,这很棘手。请参阅:h't't'p://erlend.oftedal.no/blog/?blogid=7

3 web配置-需要:

添加LDS连接字符串 添加ActiveDirectoryMembershipProvider 添加 将自定义绑定更改为包含请参见 例如:

<configuration>

  <connectionStrings>
    <add name="ADConnectionString" connectionString="LDAP://myserver:[SSL port number]/[where your user are in LDS, in my case: ‘OU=ADAM Users,O=Microsoft,C=US’]" />
  </connectionStrings>

  <system.web>
    <compilation debug="true" targetFramework="4.0" />
    <membership defaultProvider="MyActiveDirectoryMembershipProvider">
      <providers>
        <add
          name="MyActiveDirectoryMembershipProvider"
          type="System.Web.Security.ActiveDirectoryMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a"
          connectionStringName="ADConnectionString"
          connectionUsername="[domain]\[username]"
          connectionPassword="[plain text windows password]"
          connectionProtection="Secure"
            />
      </providers>
    </membership>
  </system.web>

  <system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />

    <behaviors>
      <serviceBehaviors>
        <behavior name="MyServiceBehaviour">
          <serviceMetadata
            httpsGetEnabled="true"
            httpGetEnabled="false" />
          <serviceDebug includeExceptionDetailInFaults="false" />

          <serviceCredentials>
            <userNameAuthentication
              userNamePasswordValidationMode="MembershipProvider"
              membershipProviderName="MyActiveDirectoryMembershipProvider"/>
          </serviceCredentials>

        </behavior>
      </serviceBehaviors>
    </behaviors>

    <bindings>
      <customBinding>
        <binding name="myCustomBinding">
          <security authenticationMode="UserNameOverTransport"/>
          <!--            <binaryMessageEncoding /> this is optional, but good for performance-->
          <httpsTransport />
        </binding>
      </customBinding>
    </bindings>

    <services>
      <service name="MessageBasedSecurity.Web.MyWCFService" behaviorConfiguration="MyServiceBehaviour">
        <endpoint address="" binding="customBinding" bindingConfiguration="myCustomBinding"
            contract="MessageBasedSecurity.Web.MyWCFService" />
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>

  </system.serviceModel>
</configuration>

我希望这对某人有帮助。我欢迎评论/改进。

Hmmm,有几点不同:我将使用basicHTTPBinding而不是wsHTTPBinding SL要求,我将不使用Windows身份验证,因为PC不在内部网内,用户也不在内部网内,只有ADAM身份验证。实际上看起来更接近我想要的,我会尝试一下,让大家知道它是怎么回事。谢谢你的指点!希望您能够查看不同的场景,选择相关的配置片段,并将它们应用到您的情况中。祝你好运