WCF身份验证之用户名密码认证

转载 2017年01月03日 11:56:26

WCF支持多种认证技术,例如Windowns认证、X509证书、Issued Tokens、用户名密码认证等,在跨Windows域分布的系统中,用户名密码认证是比较常用的,要实现用户名密码认证,就必须需要X509证书,用来加密用户名和密码。

  1. 创建数字证书

    makecert -sr localmachine -ss My -n CN=ejiyuan -sky exchange -pe -r。

  2. 创建服务代码

[ServiceContract]
    public interface ICalculator
    {
        [OperationContract]
        double add(double x, double y);
    }

    public class CalculatorService : ICalculator
    {

        public double add(double x, double y)
        {
            return x + y;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            ServiceHost _serviceHost = new ServiceHost(typeof(CalculatorService));
            _serviceHost.Opened += (s, q) =>
            { 
                Console.WriteLine("服务已启动");
                Console.Read(); 
            };
            _serviceHost.Open();
        }
    }

3.设置安全验证模式

<bindings>
      <netTcpBinding>
        <binding name="nonSessionBinding">
          <!--当前绑定的安全认证模式-->
          <security mode="Message" >
            <!--定义消息级安全性要求的类型,为证书-->
            <message clientCredentialType="UserName" />
          </security>
        </binding>
      </netTcpBinding>
    </bindings>

4.设置服务凭据值

<behaviors>
      <serviceBehaviors >
        <behavior name="CalculatorServiceBehavior" >
          <serviceCredentials>
            <!--指定一个 X.509 证书,用户对认证中的用户名密码加密解密-->
            <serviceCertificate findValue="CN=ejiyuan" x509FindType="FindBySubjectDistinguishedName" storeLocation="LocalMachine" storeName="My"/>
            <clientCertificate>
              <!--自定义对客户端进行证书认证方式 这里为 None-->
              <authentication certificateValidationMode="None"/>
            </clientCertificate> 
            <!--自定义用户名和密码验证的设置-->            
            <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="Wcf.Extensions.Security.UserNamePasswordValidator,Wcf.Extensions.Security" />           
          </serviceCredentials>          
        </behavior>
      </serviceBehaviors>
    </behaviors>

5.自定义证书验证
通过继承自’System.IdentityModel.Selectors.UserNamePasswordValidator’,然后我们重写里面的’Validate’方法来实现用户名密码认证逻辑

public class UserNamePasswordValidator : System.IdentityModel.Selectors.UserNamePasswordValidator
    {
        public override void Validate(string userName, string password)
        {
            if (userName != "ejiyuan" || password != "123456")
            {
                throw new System.IdentityModel.Tokens.SecurityTokenException("Unknown Username or Password");
            }
        }
    }

6.客户端代码

class Program
    {
        static void Main(string[] args)
        {
            CalculatorClient client = new CalculatorClient();
            //指定认证的用户名和密码
            client.ClientCredentials.UserName.UserName = "ejiyuan";
            client.ClientCredentials.UserName.Password = "123456";

            var q = client.add(1, 2);
            Console.WriteLine(client.add(1,2));
            Console.Read();
        }
    }

7.客户端配置信息(自动生成的)

<system.serviceModel>
        <bindings>
            <netTcpBinding>
                <binding name="NetTcpBinding_ICalculator" >
                    <security mode="Message">
                        <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
                        <message clientCredentialType="UserName" />
                    </security>
                </binding>
            </netTcpBinding>
        </bindings>
        <client>
            <endpoint address="net.tcp://192.168.101.13:8000/calculatorservice"
                binding="netTcpBinding" bindingConfiguration="NetTcpBinding_ICalculator"
                contract="ServiceReference1.ICalculator" name="NetTcpBinding_ICalculator">
                <identity>
                    <certificate encodedValue="AwAAAAEAAAAUAAAAgvtzbyRkxIGFn4UuyxD2+XJsJl8gAAAAAQAAAPQBAAAwggHwMIIBWaADAgECAhB/oj2gX287pUAmeLEVtWucMA0GCSqGSIb3DQEBBAUAMBIxEDAOBgNVBAMTB2VqaXl1YW4wHhcNMTAwNTI4MDkyNjQzWhcNMzkxMjMxMjM1OTU5WjASMRAwDgYDVQQDEwdlaml5dWFuMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCfOgnw6Vs7gS52Gsud0WsuFOoDeF4+4DL1HFIpQupdExtIkWwY2v2/t/pWHRRvPE/aPf3M6axUYaT4pQqPXBHQR1lb0Hi6XLUGkzsEk7tjiEMEkpt+/8rQIdtXlmmry7yDixoX8PKEd5cGAISjEdbVKJqjQnC55rQXeDYlIXoqlwIDAQABo0cwRTBDBgNVHQEEPDA6gBCTu+dYQbdaauBGEk3SjJ5FoRQwEjEQMA4GA1UEAxMHZWppeXVhboIQf6I9oF9vO6VAJnixFbVrnDANBgkqhkiG9w0BAQQFAAOBgQA1jOywoJ5Xh6B6W3Vw7xPa9A6AH0WtedXPd4YbCU465UdKeP5G2HtKLpS20MnkU6lIh22lxMnb3WGZh70l5Sg1Hl0j/SklLKtOXzeQnVLaPundd9RS1TD/hHwVyu+89cr0866etfGwI9IDpwjhj5ixT3VUHI3eGrXRj+IGx8/W8Q==" />
                </identity>
            </endpoint>
        </client>
    </system.serviceModel>

备注:基于UserNamePasswordValidator的认证方式,Validator中可以知道相应的UserName和Password,在Service中直接使用OperationContext.Current.ServiceSecurityContext.PrimaryIdentity即可获取当前登录用户信息。

WCF----UserName身份验证全记录

转载http://www.cnblogs.com/chenxizhang/archive/2009/05/13/1455582.html 我现在用一个实录的方式,介绍一下UserName的身...
  • quan278905570
  • quan278905570
  • 2015年02月04日 16:08
  • 1371

C# WCF简单实例 出错:调用方未由服务进行身份验证

以订票为例简单应用wcf  新建一个wcf服务应用程序 在IService1.cs定义服务契约  复制代码代码如下: namespace WcfDemo  ...
  • partner1
  • partner1
  • 2014年10月11日 13:28
  • 1516

WCF身份验证之用户名密码认证

WCF支持多种认证技术,例如Windowns认证、X509证书、Issued Tokens、用户名密码认证等,在跨Windows域分布的系统中,用户名密码认证是比较常用的,要实现用户名密码认证,就必须...
  • nnsword
  • nnsword
  • 2011年12月05日 12:59
  • 1296

IIS 访问需要用户名和密码 (需要进行身份验证)

(1)故障描述:在IIS下发布了某个站点某些页面文件,我们姑且设定为1.htm,通过IIS里面的浏览功能查看页面能够顺利访问里面的内容。同时我们从访问地址处看到信息为http://localhost/...
  • xd43100678
  • xd43100678
  • 2011年11月08日 10:43
  • 31999

WCF通过消息拦截进行身份验证

  • 2016年10月07日 12:30
  • 124KB
  • 下载

WCF 身份验证 通过检查客户端IP

  • 2012年03月11日 16:07
  • 74KB
  • 下载

Nginx集群之WCF分布式身份验证(支持Soap)含源代码

  • 2017年11月20日 18:45
  • 1.78MB
  • 下载

WCF的用户名+密码认证方式

WCF的用户名+密码认证方式 分类: ASP.NET 2011-08-02 22:50 2421人阅读 评论(0)收藏 举报 我们解决问题的方式采用了客户端用户名+密码的方式来进行...
  • JIAJINHAO
  • JIAJINHAO
  • 2011年08月24日 08:32
  • 931

WCF的用户名+密码认证方式

概述 今天在做Master Data Service(后面简称MDS)项目时需要通过WCF来使用MDS的API,从而对MDS的数据进行操作。在这个过程中,遇到了一个棘手的问题,就是在客户端调用Web ...
  • xuyue1987
  • xuyue1987
  • 2011年08月02日 22:50
  • 17452

Silverlight WCF RIA服务(三十)身份验证、角色、个性化 1

在Web应用中,我们经常会限制某些特定用户使用一些功能,并对每个用户保持性能。ASP.NET提供了身份验证、角色、个性化实现这些功能。身份验证允许我们核实用户的凭证并标记用户为已登录。角色允许我们根据...
  • Eric_K1m
  • Eric_K1m
  • 2013年07月11日 14:44
  • 561
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:WCF身份验证之用户名密码认证
举报原因:
原因补充:

(最多只允许输入30个字)