我是WCF的新手,我正在尝试设置服务并收到两条不同的建议:
我可以看到的区别在于方法二,每次调用服务时都会验证用户凭据,而且我不必在服务器上保持会话状态,我喜欢。
我是否误解了这些概念,两者解决了不同的问题?
有人可以帮我理解这两个以及何时使用它们?
答案 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"/>
因此,在消息层使用用户名/密码作为凭证与使用用户名/密码作为认证机制是不同的(并且是分开的)。希望这有助于您理解概念