C# 带有自定义身份验证的.NET 4.5 WCF rest

C# 带有自定义身份验证的.NET 4.5 WCF rest,c#,asp.net,web-services,wcf,webhttpbinding,C#,Asp.net,Web Services,Wcf,Webhttpbinding,首先,我是WCF的新手。 我使用WCF创建了一个REST Web服务。它只有一个操作可以检索json格式的产品列表。这是使用jquery从web调用的。 它工作得很好 现在,我需要的是向Web服务添加自定义身份验证。是否可以将其添加到webHttpBinding? 我添加了验证: 公共类ServiceAuthenticator:UserNamePasswordValidator { public override void Validatestring用户名、字符串密码 { 如果null==用户

首先,我是WCF的新手。 我使用WCF创建了一个REST Web服务。它只有一个操作可以检索json格式的产品列表。这是使用jquery从web调用的。 它工作得很好

现在,我需要的是向Web服务添加自定义身份验证。是否可以将其添加到webHttpBinding? 我添加了验证:

公共类ServiceAuthenticator:UserNamePasswordValidator { public override void Validatestring用户名、字符串密码 { 如果null==用户名| | null==密码 { 抛出新异常; } 如果userName!=testuser { 抛出新的SecurityTokenExceptionUnknown用户名或密码; } } } 我试图更改web.config以使其正常工作,但我做不到

这是我的web.config,在没有自定义身份验证的情况下工作:

以下是调用ws的jquery:

当我执行此操作时,它工作正常,但从未到达自定义验证器。我的web.config中是否缺少任何内容?如何将自定义身份验证应用于此类Web服务

我正在使用: .NET Framework 4.5 带VS2012的IIS Express

提前谢谢

编辑

身份验证由IIS执行,因此未触发自定义验证。 有一些变通办法:

自助服务, ISS托管使用ServiceAuthorizationManager执行自定义身份验证它应该用于授权,而不是身份验证,但这是我找到的唯一方法。这里有更多信息: 如果有人有其他解决方法…你可以自由发表评论!
我希望这能有所帮助。

我知道我参加聚会迟到了,但我必须用我自己的一项服务来解决这个问题,其中IIS盗用了身份验证,但不清楚发生了什么,也不知道如何解决,所以这里是一个逐步解决的问题:

首先创建一个执行身份验证的类:

您的类必须从System.IdentityModel.Selectors System.IdentityModel命名空间中的UserNamePasswordValidator派生:

using System.IdentityModel.Selectors;

namespace MyProject
{
    public class CustomUserNameValidator : UserNamePasswordValidator
    {
        public override void Validate(string userName, string password)
        {
            if (username != "Bob" || password != "Letmein")
                through new SecurityTokenException("If you're name's not Bob, you're not coming in!")
        }
    }
}
接下来,您需要为您的开发端点提供SSL证书:

有许多教程可用于生成您自己的自签名证书。我用过,但有很多,你可能会发现其他更简单的方法。由于浏览器对自签名证书的限制,我使用直接自签名证书的成功率有限。为了避免这种情况,我使用相同的过程创建了根证书颁发机构,然后使用我的RCA创建了一个签名证书。这似乎满足了浏览器的限制并消除了任何警告。[严格地说,这很可能超出了要求,但警告让我很烦恼。]

创建SSL证书后,请使用certificates.msc将其注册到本地计算机\个人\证书的证书中

将您的IIS端点与端口443或您希望拥有刚刚创建的证书的任何端口绑定

接下来,您需要定义服务行为:

您的服务行为必须包含对凭据验证器和SSL证书的引用

    <behavior name="MyCustomCredentialBehavior">
      <serviceCredentials>
        <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="MyProject.MyCustomCredentialValidator, MyAssembly" />
        <serviceCertificate findValue="CN=*.dev.myco.com"                             
                            x509FindType="FindBySubjectDistinguishedName" 
                            storeLocation="LocalMachine" />

      </serviceCredentials>
      <serviceMetadata httpGetEnabled="true" />
    </behavior>
您可以使用可分辨名称或指纹引用您的证书。在我这里的示例中,我使用了创建证书时选择的可分辨名称。如果使用指纹,复制/粘贴指纹时要小心,因为序列开头有一个字节标记字符,它会搞乱你的引用,因此你的应用程序找不到它。手动复制序列比受挫更容易——或者通过其他一些纯文本编辑器(如记事本)复制,这样可以去除未打印的字符

最后,您需要您的服务配置来引用您的服务行为:


如果我没记错的话,这应该是您所需要的一切。

您必须使用HTTPS才能调用您的验证程序方法。Rick,我该怎么做?看看这是否有帮助:请看一下:
    <behavior name="MyCustomCredentialBehavior">
      <serviceCredentials>
        <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="MyProject.MyCustomCredentialValidator, MyAssembly" />
        <serviceCertificate findValue="CN=*.dev.myco.com"                             
                            x509FindType="FindBySubjectDistinguishedName" 
                            storeLocation="LocalMachine" />

      </serviceCredentials>
      <serviceMetadata httpGetEnabled="true" />
    </behavior>
  <service name="MySecureService"
           behaviorConfiguration="MyCustomCredentialBehavior">
    <host>
      <baseAddresses>
        <add baseAddress="https://myservice.com/mysecureservice/" />
      </baseAddresses>
    </host>
    <endpoint name="MySecureServiceEndpoint" 
              binding="webHttpBinding" 
              contract="IMySecureService" />
  </service>