转 http://www.cnblogs.com/yoshiki1895/archive/2009/06/03/1495440.html

1.1      WebService设计

1.1.1   传输基本参数

1.1.2   传输数据集合

(1)     数组

(2)     DataSet

1.2      WebService异常处理

1.3      WebService性能

1.4      WebService认证

请参考WebService认证学习报告

1.4.1   各种认证方式

1.4.1.1      Windows认证

(1)   配置IIS中WebService文件的权限为集成Windows认证

(2)   设置Web.Config

<authentication mode= "Windows">

</authentication>

1.4.2   跟踪用户访问

1.5      WebService调用

1.5.1   Windows认证

(1)   NT认证使用时,Credentials必须指定System.Net.CredentialCache.DefaultCredentials

当设置为default时,客户端根据服务端配置决定采用NTLM认证还是其他的安全认证

(2)   实例化WebService对象

(3)   添加WebService认证信息

(4)   调用WebService方法

LocalTest.GIISService localTest = new LocalTest.GIISService();

CredentialCache credentialCache = new CredentialCache();

NetworkCredential credentials = new NetworkCredential("XuJian", "password", "Snda");

credentialCache.Add(new Uri("http://localhost/GIIS/ GIISService.asmx"),

"Basic", credentials);

localTest.Credentials = credentialCache;

string tt = localTest.Hello("ssssssss");

1.6      GIIS中WebService认证实现

该部分为本次GIIS中实现的认证方式,考虑到相关配置、维护性,不涉及其他认证方式的处理

1.6.1   实现方式

SOAP Header + DES加解密 + Windows认证

1.6.2   实现原理

(1)   SOAP Header

SOAP包括四个部分: SOAP封装(envelop),定义描述消息

SOAP编码规则

SOAP RPC调用和应答协定

SOAP绑定,底层协议交换信息

其中envelop由一个或多个Header和一个Body组成,Header元素的每一个子元素称为一个SOAP Header

(2)   DES对称加解密

通过Client端传输过来的已加密编码,在客户端进行解码分析,实现认证,认证的user信息来自于GIIS的系统登录用户列表

对编码和解码的字节类型存储在Web.Config文件中,要保持一致并对称,且字符长度需设为8位

(3)   集成Windows认证

作为域用户可以通过该方式来调用、处理WebService,但非域用户看通过我们自定义的SOAP Header方式来验证

1.6.3   实现步骤(SOAP)

(1)   设置.asmx文件的访问权限为“集成Windows认证”,不允许匿名访问

(2)   创建WebService认证类CredentialSoapHeader.cs,继承SoapHeader

*调用者的信息从系统维护的WscUser表中获取

namespace XXX.WebService

{

public class CredentialSoapHeader : System.Web.Services.Protocols.SoapHeader

{

#region -- Private Attribute --

private string m_UserID = string.Empty;

private string m_Password = string.Empty;

#endregion

#region -- Private Attribute --

/// <summary>

/// user id

/// </summary>

public string UserID

{

get

{

return m_UserID;

}

set

{

m_UserID = value;

}

}

/// <summary>

/// user password

/// </summary>

public string PassWord

{

get

{

return m_Password;

}

set

{

m_Password = value;

}

}

#endregion

/// <summary>

/// initial user id and papssword

/// </summary>

/// <param name="userID">user id</param>

/// <param name="password">user password</param>

public void Initial(string userID, string password)

{

UserID = userID;

PassWord = password;

}

/// <summary>

/// check user when use web service

/// </summary>

/// <param name="userID">user id</param>

/// <param name="password">user password</param>

/// <param name="message">return message</param>

/// <returns></returns>

public bool IsValid(string userID, string password, out string message)

{

message = "";

try

{

string userName = Encrypt.DecryptClient(userID);

string userPassword = Encrypt.DecryptClient(password);

Entity.GiWscuser userAuthority = new Entity.GiWscuser();

userAuthority.QueryMode = true;

userAuthority.Active += true;

userAuthority.Account += userName.Trim();

userAuthority.Password += userPassword.Trim();

DataTable dtblUser = userAuthority.Query(

new String[] {userAuthority.Account, userAuthority.Password }, false, -1).Tables[0];

if (dtblUser.Rows.Count > 0)

{

return true;

}

else

{

message = "sorry, you have no access authority for current web service";

return false;

}

}

catch(Exception ex)

{

message = "sorry, you have no access authority for current web service " + ex.Message;

return false;

}

}

/// <summary>

/// check user authority

/// </summary>

/// <param name="message">message tip</param>

/// <returns></returns>

public bool IsValid(out string message)

{

return IsValid(m_UserID, m_Password, out message);

}

}

}

(3)   创建DES加解密类,实现明文编码与解码

public class Encrypt

{

private static string ms_Key = System.Configuration.ConfigurationManager.AppSettings["EncryptKey"];

private static string ms_IV = System.Configuration.ConfigurationManager.AppSettings["EncryptIV"];

/// <summary>

/// Encrypt a string

/// </summary>

/// <param name="ecryptString">string needs to be encrypted</param>

/// <returns>the encrypted string</returns>

public static string EncryptClient(string ecryptString)

{

if(ecryptString != "")

{

DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();

cryptoProvider.Key = ASCIIEncoding.ASCII.GetBytes(ms_Key);

cryptoProvider.IV = ASCIIEncoding.ASCII.GetBytes(ms_IV);

MemoryStream memoryStream = new MemoryStream();

CryptoStream cryptoStream = new CryptoStream(memoryStream,

cryptoProvider.CreateEncryptor(), CryptoStreamMode.Write);

StreamWriter streamWriter = new StreamWriter(cryptoStream);

streamWriter.Write(ecryptString);

streamWriter.Flush();

cryptoStream.FlushFinalBlock();

memoryStream.Flush();

return Convert.ToBase64String(memoryStream.GetBuffer(),0,Int32.Parse(memoryStream.Length.ToString()));

}

else

{

return "";

}

}

/// <summary>

/// Decrypt a string

/// </summary>

/// <param name="decryptString">string needs to be decrypted</param>

/// <returns>the decrypted string</returns>

public static string DecryptClient(string decryptString)

{

if(decryptString != "")

{

DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();

cryptoProvider.Key = ASCIIEncoding.ASCII.GetBytes(ms_Key);

cryptoProvider.IV = ASCIIEncoding.ASCII.GetBytes(ms_IV);

Byte[] buffer = Convert.FromBase64String(decryptString);

MemoryStream memoryStream = new MemoryStream(buffer);

CryptoStream cryptoStream = new CryptoStream(memoryStream, cryptoProvider.CreateDecryptor(), CryptoStreamMode.Read);

StreamReader streamReader = new StreamReader(cryptoStream);

return streamReader.ReadToEnd();

}

else

{

return "";

}

}

(4)   在CredentialSoapHeader类中实现用户认证信息的解码与合法性检查,给出异常时的提示信息

见CredentialSoapHeade的代码

(5)   在目标Service类中实例化CredentialSoapHeader对象,并指定该对象为WebService方法的修饰

Namespace WebServiceAuthority

{

[WebService(Namespace = "http://tempuri.org/")]

[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]

public class GIISService : System.Web.Services.WebService

{

public CredentialSoapHeader myHeader = new CredentialSoapHeader();

/// <summary>

/// get web service information by authority user

/// </summary>

/// <param name="contents">customize content</param>

/// <returns></returns>

[SoapHeader("myHeader")]

[WebMethod(Description = "authority set for Web Service", EnableSession =true)]

public string HelloWorld(string contents)

{

string message = "";

if (!myHeader.IsValid(out message))

return message;

return "Hello World:" + contents;

}

}

}

1.6.4   Client端调用方法(SOAP)

(1)   添加WebService引用

URL地址为对应的GIIS WebService地址,引用的别名自定义

(2)   实例化一个WebService的类对象

LocalService.GIISService localTest = new LocalService.GIISService();

(3)   设置Credentials方式

localTest.Credentials = System.Net.CredentialCache.DefaultCredentials;

(4)   传递编码后的密文

(5)   调用WebService提供的方法

(6)   实现代码如下:

LocalService.GIISService localTest = new LocalService.GIISService();

localTest.Credentials = System.Net.CredentialCache.DefaultCredentials;//default credetials

LocalService.CredentialSoapHeader header = new LocalService.CredentialSoapHeader();//Create SOAP header

header.UserID = userName;//Set SOAP header user name information

header.PassWord = userPassword;//Set SOAP header user password information

localTest.CredentialSoapHeaderValue = header;

this.Label1.Text = localTest.HelloWorld("ss");

至此已实现GIIS中的WebService验证,如单独采用Windows认证请参见下面的说明

WebService的几种验证方式的更多相关文章

  1. Web.xml中四种验证方式

    源地址:https://blog.csdn.net/imimi_/article/details/78805642 <security-constraint> 的子元素 <http- ...

  2. Tomcat学习总结(5)——Tomcat容器管理安全的几种验证方式

    当访问服务器中受保护的资源时,容器管理的验证方法可以控制确认用户身份的方式.Tomcat支持四种容器管理的安全防护,它们是: BASIC (基本验证):通过HTTP验证,需要提供base64编码文本的 ...

  3. WebService客户端几种实现方式

    1.jdk原生调用(需要获取服务接口文件) import java.net.URL; import javax.xml.namespace.QName; import javax.xml.ws.Ser ...

  4. SSH两种验证方式原理

    本帖转自 http://www.cnblogs.com/hukey/p/6248468.html SSH验证方式有两种,分别为用户密码认证以及密钥认证. 1.用户密码认证方式 说明: (1) 当客户端 ...

  5. [ SSH 两种验证方式原理 ]

    SSH登录方式主要分为两种: 1. 用户名密码验证方式 说明: (1) 当客户端发起ssh请求,服务器会把自己的公钥发送给用户: (2) 用户会根据服务器发来的公钥对密码进行加密: (3) 加密后的信 ...

  6. linux下ssh的几种验证方式

    ssh的认证方式有很多种,大概可以概括为以下几类: 1.pam认证方式 在配置文件/etc/ssh/sshd_config中对应参数:UsePAM 2.密钥认证方式 配置文件/etc/ssh/sshd ...

  7. JGit与远程仓库链接使用的两种验证方式(ssh和https)

    JGit是使用JAVA的API来操控Git仓库的库,由Eclipse公司维护.他提供的API分成两个层次,底层命令和高层命令.底层API是直接作用于低级的仓库对象,高层的API是一个面向普通用户级别功 ...

  8. JGit与远程仓库链接使用的两种验证方式(ssh和https)

    JGit是使用JAVA的API来操控Git仓库的库,由Eclipse公司维护.他提供的API分成两个层次,底层命令和高层命令.底层API是直接作用于低级的仓库对象,高层的API是一个面向普通用户级别功 ...

  9. java 调用wsdl的webservice接口 两种调用方式

    关于wsdl接口对于我来说是比较头疼的 基本没搞过.一脸懵 就在网上搜 看着写的都很好到我这就不好使了,非常蓝瘦.谨以此随笔纪念我这半个月踩过的坑... 背景:短短两周除了普通开发外我就接到了两个we ...

随机推荐

  1. 【Maven】Project configuration is not up-to-date with pom.xml错误解决方法

    导入一个Maven项目之后发现有一个如下的错误: Project configuration is not up-to-date with pom.xml. Run project configura ...

  2. poj 1236 强联通分量

    大致题意给你有一个点数为n<=100的有向图. 求解两个子任务: 1:最少给多少个点信息,这些点的信息可以顺着有向边传遍全图. 2:最少要加多少条边,使得整个图强联通. 求强联通分量再缩点后得到 ...

  3. i.MX6 设备树 GPIO 默认值

    /********************************************************************** * i.MX6 设备树 GPIO 默认值 * 说明: * ...

  4. Java中的comparable接口和Comparator接口的区别

    一.comparable和Comparator的区别 1.Comparable和Comparator都是用来实现集合中元素的比较.排序的. 2.Comparable是在类内部定义的方法实现的排序,位于 ...

  5. 【Java】身份证号码验证

    代码引用自:https://gitee.com/appleat/codes/ynrtqujv0wfgesm8ia9b547 package xxx; /** * Created by wdj on 2 ...

  6. Unity等待写入数据

    EasyTouch中QuickGesture的用法 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 1 Qu ...

  7. input标签(文本域和文件域)

    单行文本域: <form> <input type="text" name="..." ....../> </form> 属 ...

  8. about Version Control(版本控制)

    what: 版本控制系统是一种软件,它可以帮助您跟踪代码随时间的变化. 在编辑代码时,您告诉版本控制系统对文件进行快照. 版本控制系统将永久保存该快照,以便在以后需要时可以收回它. 如果没有版本控制, ...

  9. AtCoder Grand Contest 031 简要题解

    AtCoder Grand Contest 031 Atcoder A - Colorful Subsequence description 求\(s\)中本质不同子序列的个数模\(10^9+7\). ...

  10. 【mysql】索引原理-MySQL索引原理以及查询优化

    转载:https://www.cnblogs.com/bypp/p/7755307.html 一.介绍 1.什么是索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性 ...