对WCF和ASP.NET MembershipProvider Forms身份验证感到困惑

时间:2011-08-03 18:19:20

标签: asp.net wcf forms-authentication membership-provider

阅读,观看视频,Google搜索,我对如何将WCF与使用带有MembershipProvider的表单身份验证的ASP.NET应用程序进行连接感到非常困惑。我已经看到了一个建议你使用专门的服务主机,这里解释(http://msdn.microsoft.com/en-us/library/bb398990.aspx] [1]):

<%@ ServiceHost Language="C#" 
                Service="System.Web.ApplicationServices.AuthenticationService" %>

我还看到了一个在ServiceFactory中执行它的实现:

ServiceHost serviceHost = new ServiceHost (typeof(MyServices), baseAddresses)
                          {
                             Credentials =
                             {
                                UserNameAuthentication =
                                   {MembershipProvider = Membership.Provider}
                             },
                             Authorization =
                             {
                                PrincipalPermissionMode = PrincipalPermissionMode.UseAspNetRoles
                             }
                          };

serviceHost.Credentials.ServiceCertificate.SetCertificate(HttpContext.Current.Request.ServerVariables["HTTP_HOST"]);

这两种方法都让我感到困惑。对于第一个,我在哪里指定我的具体服务合同,如果我有多个服务怎么办?第二种方法更清晰。但是在这两种情况下,如果我尝试访问表单身份验证受保护的目录会发生什么,例如,mysite / admin / myservice.svc?安全机制是否会在服务和目录访问级别上启动?如果您想使用两个不同的成员资格提供程序,一个用于文件访问而另一个用于实际的WCF服务,该怎么办?这不是一个不寻常的情况。

任何帮助都会很棒,感到茫然和困惑。

1 个答案:

答案 0 :(得分:1)

WCF的优点在于,这可以在web.config中完成,也可以通过代码隐藏(根据您的喜好)来完成。 WCF的身份验证在行为中处理。我发现使用web.config更容易绑定。以下是服务器配置外观的快速示例。

<system.serviceModel>
<bindings>
   <wsHttpBinding> <!-- required since BasicHttpBinding has no security model -->
     <binding name="FormsAuthProvider">
       <security mode="Message">
         <message clientCredentialType="UserName" negotiateServiceCredentials="true"/>
       </security>
     </binding>
   </wsHttpBinding>
 </bindings>
 <behaviors>
   <serviceBehaviors>
      <behavior name="FormsAuthProvider">
        <serviceCredentials>
          <usernameAuthetication userNamePasswordValidationMode="MembershipProvider" membershipProviderName="formsProvider"/>
        </serviceCredentials>    
      </behavior>
    </serviceBehaviors>
  </behaviors>    
  </system.serviceModel>  
  <system.web>
    <membership>
      <providers>
         <add name="formsProvider" type="..."/>
      </providers>
    </membership>
  </system.web>

此示例配置适用于邮件安全性 - 而非传输安全性(安全模式)。如果您在服务本身上具有目录安全性,则需要在使用服务端点之前对其进行身份验证。

由于某种原因,

MSDN没有将此选项列为常见安全方案。