【问题标题】:Authenticating with WCF使用 WCF 进行身份验证
【发布时间】:2012-04-17 12:20:17
【问题描述】:

我有一个 WCF 应用程序,我想向某些人公开,但是为了让他们使用我想以某种方式对他们进行身份验证的服务,是否可以创建我自己的成员资格提供程序来检查用户是否通过调用ValidateUser 方法进行验证?另外,我将如何告诉我的绑定/行为使用此成员资格提供程序?

编辑

我对此也有一些疑问。例如:如果我从我的客户端调用我的 web 服务上的一个名为 QueryStock 的方法。它是在触发方法之前首先使用我的会员提供程序验证用户,还是我必须将用户名和密码作为参数传递,然后在我的方法中执行代码之前执行Membership.ValidateUser(username, password)?

【问题讨论】:

    标签: c# wcf wcf-security


    【解决方案1】:

    这一切都可以通过 WCF 完成,我现在将它用于我们拥有的 WCF 服务。

    您可以创建自己的成员资格提供程序(就像您为 asp.net 应用程序创建的那样),然后也将其引入 WCF。如果您在谷歌上搜索“WCF 会员资格提供者”,就会有大量相关信息。这篇文章也可能对您有所帮助:WCF Authentication using SQL Membership Provider

    【讨论】:

    • 我真的不想使用 SQL 成员资格提供程序或角色,因为我有自己的功能来验证用户,我只需将其放入 ValiateUser 方法中
    【解决方案2】:

    是的,这是可能的。看看 this 文章,它展示了一个使用自定义提供程序的示例。

    【讨论】:

    • 除非我遗漏了什么,否则该链接现在确实解释了如何将成员资格提供程序与 WCF 一起使用 - 尽管它确实解释了如何在没有成员资格提供程序的情况下进行用户验证。
    • 我可能有点高兴,误解了他想要什么。尽管他可以使用自定义提供者,并且不限于会员提供者。
    • 实现验证的最佳方式是什么?我已经有一个数据存储和一个检查用户名/密码的方法,它不是 SQL。
    • public override void Validate(string username, string password) { if (!MyExistingValidationMethods(username, password) throw new SecurityTokenException("Username and password required"); } 如果验证返回 true,则将继续使用 webservice 方法。
    • 这个方法我试过了,不行,可能是证书的问题,所以我想用会员服务商
    【解决方案3】:

    我也有这个问题: Authentication in WCF for every call

    如您所见,您可以使用 ASP.NET 身份验证。

    如果您有自己的方法来验证用户,我会尝试使用一种外观来使用用户 + 令牌调用每个服务方法并保持一种“异步会话”。

    因此您可以在用户第一次登录时创建一个新令牌,然后在每次调用中创建一个新令牌,然后在下一次调用中使用它。仅使用带有用户 + 令牌的表来保护您的所有呼叫。

    【讨论】:

      【解决方案4】:

      你需要在配置中定义一个行为,例如:

      <behaviors>
        <serviceBehaviors>
          <behavior name="Framework.Services.FrameworkBehaviour">
            ...
            <serviceAuthorization principalPermissionMode="UseAspNetRoles" roleProviderName="CustomProvider" />
            <serviceCredentials>
              <serviceCertificate ... />
              <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="...." />
            </serviceCredentials>
          </behavior>
      

      这是绑定sn-p:

         <binding name="userNamePassOverSsl" ...>
            <security mode="TransportWithMessageCredential">
              <transport  />
              <message clientCredentialType="UserName" />
            </security>
          </binding>
      

      【讨论】:

      • 客户端如何将用户名和密码传递给网络服务?
      • @BiffBaffBoff 不,您需要使用消息安全或带有传输加密的消息安全。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-04
      • 1970-01-01
      • 2012-04-12
      • 2012-09-29
      相关资源
      最近更新 更多