简体   繁体   English

使用wshttpbinding的WCF用户名和密码验证不起作用

[英]WCF UserName & Password validation using wshttpbinding notworking

I am new to WCF Service authentication, I was trying to achieve wcfauthentication using wshttpbinding. 我是WCF服务身份验证的新手,我试图使用wshttpbinding实现wcfauthentication。 but i am getting below exception. 但我越来越例外。

Could not find a base address that matches scheme https for the endpoint with binding WSHttpBinding. 找不到与绑定WSHttpBinding的端点的方案https匹配的基地址。 Registered base address schemes are [http]. 注册的基址方案为[http]。

Web.Config: Web.Config中:

<?xml version="1.0"?>
<configuration>
  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5"/>
  </system.web>  
    <system.serviceModel>
    <bindings>
      <wsHttpBinding>
        <binding name="wsHttp">
          <security mode="TransportWithMessageCredential">
            <message clientCredentialType="UserName"/>
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <services>
      <service name="WCFAuth.Service1" behaviorConfiguration="wsHttpBehavior">
        <endpoint address="" binding="wsHttpBinding" bindingConfiguration="wsHttp" contract="WCFAuth.IService1">
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:64765/"/>
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="wsHttpBehavior">
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="false"/>
          <serviceCredentials>
            <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="WCFAuth.ServiceAuthanticator, WCFAuth"/>
          </serviceCredentials>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
    <!--
        To browse web app root directory during debugging, set the value below to true.
        Set to false before deployment to avoid disclosing web app folder information.
      -->
    <directoryBrowse enabled="true"/>
  </system.webServer>
</configuration>

Service Authentication class: 服务认证类:

using System;
using System.Collections.Generic;
using System.IdentityModel.Selectors;
using System.Linq;
using System.ServiceModel;
using System.Web;

namespace WCFAuth
{
    public class ServiceAuthanticator : UserNamePasswordValidator
    {

        public override void Validate(string userName, string password)
        {
            string AppUserName = "ABC";
            string AppPwd = "abc";
            try
            {
                if (userName.ToLower() != AppUserName.ToLower() && password != AppPwd)
                {                        
                    throw new FaultException("Unknown Username or Incorrect Password");
                }
            }
            catch (Exception ex)
            {                    
                throw new FaultException("Unknown Username or Incorrect Password");
            }
        }
    }
}

Client Side config file: 客户端配置文件:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <!--<binding name="base" />-->
              <binding name="base">
                <security mode="TransportCredentialOnly">
                  <transport clientCredentialType="Basic"/>
                </security>
              </binding>
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://localhost:64765/Service1.svc" binding="basicHttpBinding"
                bindingConfiguration="base" contract="WCFAuth.IService1" name="base" />
        </client>
    </system.serviceModel>
</configuration>

Consumer: 消费者:

class Program
    {
        static void Main(string[] args)
        {
            try
            {
                WCFAuth.Service1Client client = new WCFAuth.Service1Client();                
                client.ClientCredentials.UserName.UserName = "test";
                client.ClientCredentials.UserName.Password = "test";                
                var temp = client.GetData(1);
                Console.WriteLine(temp);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }

            Console.ReadKey();
        }
    }

I am getting attached exception when i try to browser svc file. 尝试浏览器svc文件时出现附件异常。

在此处输入图片说明

Can someone correct me, where i am committing mistake, thanks in advance. 有人可以纠正我,我犯错了,在此先感谢。

The problem here is that you are using a WSHttpBinding with Transport Security, but the base address you set is http. 这里的问题是您正在使用具有传输安全性的WSHttpBinding ,但是您设置的基址是http。 It is not possible to work with http here, because you are sending credentials over the wire. 在此处无法使用http,因为您正在通过网络发送凭据。

Either change it to https, or create a second binding configuration for development purposes. 可以将其更改为https或创建第二个绑定配置以用于开发目的。 One with Transport Security (https), and a second without (http). 一个带有传输安全性(https),另一个没有传输安全性(http)。

Also make sure that your clients binding matches the binding from your server. 另外,请确保您的客户端绑定与服务器上的绑定匹配。

As Marc mentioned, we are supposed to provide a certificate when hosting the service. 正如Marc所提到的,我们应该在托管服务时提供证书。 there might be something amiss during the process of hosting the service. 托管服务的过程中可能会出现问题。
Here is a reference configuration, wish it is useful to you. 这是参考配置,希望对您有用。

<system.serviceModel>
    <bindings>
      <wsHttpBinding>
        <binding name="wsHttp">
          <security mode="TransportWithMessageCredential">
            <message clientCredentialType="UserName"/>
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <services>
      <service name="WCFAuth.Service1" behaviorConfiguration="wsHttpBehavior">
        <endpoint address="" binding="wsHttpBinding" bindingConfiguration="wsHttp" contract="WCFAuth.IService1">
        </endpoint>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="wsHttpBehavior">
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="false"/>
          <serviceCredentials>
            <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="WCFAuth.ServiceAuthanticator, WCFAuth"/>
          </serviceCredentials>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

Then we should add a https binding in IIS Site Bindings module. 然后,我们应该在IIS网站绑定模块中添加一个https绑定。 在此处输入图片说明
The service address would be https://xxxx:8865/Service1.svc 服务地址为https:// xxxx:8865 / Service1.svc
One thing must be noted that we should trust the service certificate when we call the service by adding service reference. 必须注意一件事,当我们通过添加服务引用来调用服务时,我们应该信任服务证书。

ServicePointManager.ServerCertificateValidationCallback += delegate
              {
                  return true;
              };
            ServiceReference2.Service1Client client = new ServiceReference2.Service1Client();
            client.ClientCredentials.UserName.UserName = "jack";
            client.ClientCredentials.UserName.Password = "123456";

Besides, if we use SecurityMode.Message, we are supposed to provide a certificate in code snippets. 此外,如果使用SecurityMode.Message,则应该在代码段中提供证书。

  <serviceCredentials>
            <serviceCertificate storeLocation="LocalMachine" storeName="My" x509FindType="FindByThumbprint" findValue="869f82bd848519ff8f35cbb6b667b34274c8dcfe"/>
            <userNameAuthentication customUserNamePasswordValidatorType="WcfService1.CustUserNamePasswordVal,WcfService1" userNamePasswordValidationMode="Custom"/>
          </serviceCredentials>

Feel free to let me know if there is anything I can help with. 请随时告诉我是否有什么我可以帮助的。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM