1

我有一个调用多个 WCF 服务的 Silverlight 4 客户端。我们希望使用 SSL 对通信进行加密(我已经解决了这部分问题),并且每个呼叫都通过 AD LDS (ADAM) 进行身份验证,您有任何简单的示例来说明如何进行这项工作吗?有很多关于 oh-so-many WCF 选项的文档,但我无法找到这个特定(但我认为很常见)场景(SSL 加密 + ADAM 身份验证 + Silverlight)的简单工作示例。非常感谢任何帮助或指示。

4

4 回答 4

0

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

Shoaib,我已经看过这个,但我认为这比通过 ActiveDirectoryMembershipProvider 仅使用 .config 不太理想,因为那时您只是使用现成的组件,而不是编写自己的安全系统。

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

将 AD LDS (ADAM) 身份验证与 Silverlight 兼容的 WCF 调用(非 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)] 或Required

2) 你必须设置你的 LDS 实例启用 SSL,这很棘手。见:h'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

例子:

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

我希望这可以帮助别人。我欢迎评论/改进。

于 2010-09-09T22:23:22.100 回答
0

试试 Codeplex 网站上的这个链接,它看起来就像你描述的场景的设置和配置。它提供了所有必需设置的完整清单:

Intranet – 使用传输安全性的 Web 到远程 WCF(受信任的子系统,HTTP)

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

应用场景(WCF 安全)

于 2010-07-01T08:31:55.850 回答
0

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

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

问候。

于 2010-07-01T07:05:10.733 回答
0

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

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

如果您想使用基于角色的管理,请尝试来自 Microsoft P&P、ASP.net 成员资格提供程序的企业库,或直接通过 COM 访问授权管理器(以前称为 AzMan)

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

于 2010-08-07T16:08:46.930 回答