【问题标题】:Custom basic authentication to a WCF rest service doesn´t work对 WCF 休息服务的自定义基本身份验证不起作用
【发布时间】:2016-04-25 12:08:02
【问题描述】:

我已按照其他线程上的步骤操作:Adding basic HTTP auth to a WCF REST service

但是当我调用网络服务时,并没有要求我输入用户名和密码。我在 UserNameAuthenticator 类的所有方法中都设置了断点,并且发现调用了这些方法中的任何一个。

所以我的问题是:这个类是在哪里创建的?我应该在代码的哪里调用这些方法? web.config 文件中是否有任何代码可以为我执行此操作?

提前致谢

【问题讨论】:

  • 通过浏览器调用时是否提示输入用户名?确定您按照删除匿名访问的步骤操作了吗?
  • 我已禁用基本身份验证并启用匿名身份验证,正如 @AlwaysLearning 在另一个线程上建议的那样。 “删除匿名访问步骤”是什么意思?如果您的意思是web.config文件中的这个标签:是的,它在标签下
  • 那么,当您浏览到您的服务时,系统会提示您?
  • 没有。我不是...我立即得到服务器的响应。如果我在 UserNameAuthenticator 类的所有方法中放置断点,我可以看到这些方法永远不会被调用
  • 不,我的意思是让你的网络浏览器像myserver/service1.svc一样打开 - 如果你没有提示输入用户名,你需要先修复你的网络托管设置

标签: c# wcf rest


【解决方案1】:

为了设置 WCF Web 服务在用户验证器中使用用户名和密码,您需要设置如下服务行为:

<behaviors>
  <endpointBehaviors>
    <behavior name="webHttpBehavior">
    </behavior>
  </endpointBehaviors>
  <serviceBehaviors>
    <behavior name="ServiceBehavior">
      <serviceMetadata httpGetEnabled="false" httpsGetEnabled="true" />
      <serviceDebug httpHelpPageEnabled="true" includeExceptionDetailInFaults="true" />
      <serviceThrottling maxConcurrentCalls="2147483647" maxConcurrentSessions="2147483647"
        maxConcurrentInstances="2147483647" />
      <serviceCredentials>
        <userNameAuthentication userNamePasswordValidationMode="Custom" 
                                customUserNamePasswordValidatorType="FullyQaulifiedNameSpace.UserValidatorClass, FullyQaulifiedNameSpace" />
      </serviceCredentials>
    </behavior>
  </serviceBehaviors>
</behaviors>

用户名验证器 (UserValidatorClass) 将驻留在 Web 项目中,但可以从另一个引用的程序集中调用代码。 UserValidator 代码如下所示:

using System.IdentityModel.Selectors;


namespace MyNameSpace.Web
{
public class UserValidator : UserNamePasswordValidator
{


    public UserValidator() : base()
    {

    }

    public override void Validate(string username, string password)
    {

    }
}
}

进入 Validate 方法的最简单方法是将您的 Web 服务发布到 IIS,并附加到分配给您的 Web 服务的应用程序池的工作进程。

【讨论】:

  • 谢谢@Mmcgowa3 这个 UserValidator 类,它是我在问题中提到的线程中 UserNameAuthenticator 类的替代品吗?因为它不继承自 IHttpModule。它从 UserNamePasswordValidator 继承。那么,我需要 UserValidator 和 UserNameAuthenticator 吗?还是只有 UserValidator?抱歉,我是用户名身份验证和 WCF 的新手,现在有点困惑。再次感谢您的帮助! :)
  • 不,您不需要两者,您项目中的 UserValidator 类将代替 UserNamePasswordValidator 并且该代码可以根据您的需要验证用户名和密码。 Validate 方法将使用 SSL 用户名和密码。
  • 好的。谢谢。我会试试的。而且,“附加到分配给您的 Web 服务的应用程序池的工作进程”是什么意思?我如何附上这个?
  • 如果您能够在本地将 Web 服务发布到 IIS(首先为 SSL 目的生成自签名证书),请为您的服务分配一个应用程序池。然后使用工作站的完全限定名称myworkstation/MyService.aspx 浏览到您的 Web 服务地址,这将激活 w3wp.exe 工作线程进程表单 IIS。如果您使用 Visual Studio 附加到该进程。然后,无论何时您测试您的服务(发送呼叫),您都可以在 Validate 方法上设置一个断点并单步执行代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-18
  • 1970-01-01
  • 2012-12-24
  • 2012-03-31
  • 2013-08-26
相关资源
最近更新 更多