WCF成员资格提供者与自定义服务授权管理员w。自定义用户名验证器

时间:2010-01-18 08:49:47

标签: wcf wcf-security

我是WCF的新手,我正在尝试设置服务并收到两条不同的建议:

  1. 使用内置身份验证服务与成员资格提供程序(http://msdn.microsoft.com/en-us/library/bb398990(VS.100).aspx)(Custom UserNamePasswordValidator with Silverlight 3.0)。
  2. 将自定义服务授权管理器与自定义用户名验证程序和“TransportWithMessageCredential”(http://msdn.microsoft.com/en-us/library/ms729794(VS.100).aspx)(Architechture of service application in WCF
  3. 一起使用

    我可以看到的区别在于方法二,每次调用服务时都会验证用户凭据,而且我不必在服务器上保持会话状态,我喜欢。

    我是否误解了这些概念,两者解决了不同的问题?

    有人可以帮我理解这两个以及何时使用它们?

2 个答案:

答案 0 :(得分:6)

ASP.NET内置成员资格和角色提供程序只为您提供SQL Server数据库(和管理GUI)中的现成表和存储过程,以处理创建用户,定义角色,将用户分配给角色等等

他们为WCF提供了一个预定义的成员身份验证提供程序 - 所以基本上,您只是免费获得或多或少的所有内容,而不必担心创建用户,管理密码和创建用户的所有细节问题。等等。

对于初学者,我肯定会使用这个选项 - 更容易,更快地启动和运行。

自定义身份验证验证程序更像是一个高级主题,如果您具有超出ASP.NET成员资格提供程序的特定和专门需求,您可能希望查看该主题。它为您提供更多功能 - 您基本上可以从WCF获取用户名和密码,并且由您决定是否对该呼叫者进行身份验证 - 但它确实也是相当多的工作。

进行身份验证的方式没有区别 - WCF的最佳做法是使用每次呼叫服务,在这种情况下,您将始终通过每次呼叫对您的呼叫者进行身份验证基础 - 无论您在后台使用何种身份验证机制(Active Directory,ASP.NET成员身份,自定义)。

所以我绝对建议使用ASP.NET内置的成员资格和角色提供程序,只要这些就足够了 - 而且我很确定它们会很长时间没问题!

答案 1 :(得分:3)

您提供的2个选项不是互斥的,用户名/密码验证是消息验证机制。其目的是为发送消息的用户提供凭据。

TransportWithMessageCredential是一种传输级加密方式,例如,您使用SSL加密传输级别,并在其中嵌入用户凭据和消息。

会员资格&角色提供程序是用于验证用户传递的凭据的方法,它看起来像这样。

 <serviceBehaviors>
       <behavior name="myCustomBehavior">
          <serviceCredentials>
             <userNameAuthentication userNamePasswordValidationMode="MembershipProvider"
                 membershipProviderName="MembershipProvider" />
          </serviceCredentials>
       </behavior>
    </servicebehaviors>

 <system.web>
  <membership defaultProvider="MembershipProvider" userIsOnlineTimeWindow="15">
   <providers>
    <clear />
     <add name="MembershipProvider" type="MyApp.AP.SimpleSqlMembershipProvider, MyApp.AP" connectionStringName="APServer" applicationName="/MyApp" />
   </providers>
  </membership>
 </system.web>

现在您可能正在使用自定义用户名密码验证程序,如下所示

<userNameAuthentication
   userNamePasswordValidationMode="Custom"
   customUserNamePasswordValidatorType=
   "MyApp.SL.CustomUserNameValidator, MyApp.SL"/>

因此,在消息层使用用户名/密码作为凭证与使用用户名/密码作为认证机制是不​​同的(并且是分开的)。希望这有助于您理解概念