使用ADAM(AD LDS)从Silverlight验证WCF调用

时间:2010-07-01 03:16:28

标签: wcf silverlight authentication ssl adam

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

4 个答案:

答案 0 :(得分:0)

您可以在WCF中使用CustomUserNameValidator: http://msdn.microsoft.com/en-us/library/aa702565.aspx http://nayyeri.net/custom-username-and-password-authentication-in-wcf-3-5

在Custom Validator的Validate Method中,您可以查询ADAM以验证用户身份。

问候。

答案 1 :(得分:0)

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

Intranet – Web to Remote WCF Using Transport Security (Trusted Subsystem, HTTP)

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

Application Scenarios (WCF Security)

答案 2 :(得分:0)

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

如果您想要基于声明的授权,ADFS 1.0(不是2.0)支持ADAM。如果你想要一个有更多选项的STS,请尝试codplex的StarterSTS

如果要使用基于角色的管理,请尝试使用Microsoft P& P中的Enterprise Library,ASP.net membership provider或直接COM访问Authorization manager(以前称为AzMan)

我更喜欢&使用基于声明的方法:

答案 3 :(得分:0)

埃德加,我也对你的任何结果感兴趣,我和你在同一个地方。

Shoaib,我看过这个,但我认为它不如仅通过ActiveDirectoryMembershipProvider使用.config,因为那时你只是使用现成的组件,而不是编写自己的安全系统。

编辑: 我希望这可以帮助别人。我无法相信互联网上没有一个很好的例子。这很简单。正如我之前所说,这比使用自定义身份验证系统更优越。

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

客户方:

1)Silverlight的调用如下所示,如果你也在使用Channel Factory,这也适用。

var client = new MyWCFServiceClient();
client.GetPersonCompleted += client_GetPersonCompleted;
client.ClientCredentials.UserName.UserName = username;
client.ClientCredentials.UserName.Password = password;
client.GetPersonAsync();

2)如果登录失败,来自服务器的返回值将具有Error属性。如果用户查找失败,则错误是令人困惑的,例如“至少有一个安全令牌无法验证”。由于您的服务器端代码无法重新包装(因为它发生在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服务类必须具有 [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]或必需

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

3)网络配置 - 需要:

  1. 添加LDS连接字符串
  2. 添加ActiveDirectoryMembershipProvider
  3. 添加<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
  4. 更改自定义绑定以包含<security authenticationMode="UserNameOverTransport"/>,请参阅http://msdn.microsoft.com/en-us/library/dd833059(VS.95).aspx
  5. 示例:

    <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>
    

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