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

WCF成员资格提供商与定制服务授权管理器w。自定义用户名验证程序,wcf,wcf-security,Wcf,Wcf Security,我是WCF的新手,正在尝试设置服务,并收到了两个不同的建议: 将内置身份验证服务与成员资格提供程序()一起使用 使用带有自定义用户名验证程序和“TransportWithMessageCredential”()的自定义服务授权管理器 我可以看到的区别在于方法二,每次调用服务时都会验证用户凭据,我不必在服务器上保持会话状态,我喜欢这样 我是否误解了这两个概念,这两个概念解决了不同的问题 有人能帮我理解这两个以及何时使用它们吗?ASP.NET内置的成员资格和角色提供程序只为您提供SQL Server

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

  • 将内置身份验证服务与成员资格提供程序()一起使用
  • 使用带有自定义用户名验证程序和“TransportWithMessageCredential”()的自定义服务授权管理器
  • 我可以看到的区别在于方法二,每次调用服务时都会验证用户凭据,我不必在服务器上保持会话状态,我喜欢这样

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


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

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

    他们为WCF提供了一个预定义的成员身份验证提供商-因此,基本上,您只需免费获得或多或少的一切,而不必担心创建用户、管理其密码等所有细节

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

    自定义身份验证验证器更像是一个高级主题,如果您有ASP.NET成员资格提供程序以外的特定和专门的需求,您可能需要研究它。它给了你更多的权力——你基本上可以从WCF获得用户名和密码,这取决于你是否要验证那个调用者——但这也需要做更多的工作,真的

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


    因此,我绝对建议您使用ASP.NET内置的成员资格和角色提供程序,只要这些功能对您来说已经足够了,而且我非常确信它们在很长一段时间内都会很好

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

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

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

    谢谢您的精彩总结!我已经实施了第二个选项,所以我现在会坚持,但很高兴知道未来。你能回答吗?