C#调用Web Service时的身份验证

转自:http://www.anqn.com/dev/vc/2010-01-23/a09122769.shtml

 

      在项目开发,我们经常会使用WebService,但在使用WebService时我们经常会考虑以下问题:怎么防止别人访问我的WebService?从哪里引用我的WebService?对于第一个问题,就涉及到了WebService是安全问题,因为我们提供的WebService不是允许所有人能引用的,可能只允许本公司或者是通过授权的人才能使用的。那怎么防止非法用户访问呢?很容易想到通过一组用户名与密码来防止非法用户的调用 。

  在System.Net中提供了一个NetworkCredential,通过它我们可以在网络中提供一个凭证,只有获得该凭证的用户才能访问相应的服务的权限。在这里我们也使用NetworkCredential。在NetworkCredential中,我们通过提供WebService发布所在的服务器名称,以及登录服务器并调用该WebService的用户名及密码(在IIS中配置)。

  在调用WebService时设置其Credential属性,把上面得到的Credential凭证赋值给它,这样只有使用提供的用户名及密码才能调用WebService服务了而其他用户则无法访问,这样就能能满足防止WebService被别人调用了。

  至于主机名,用户名及密码,对于B/S可以通过webconfig来配置,对于C/S可以使用应用程序配置文件。这样就能灵活地配置了。

  如下以C/S为例来说明,首先我们提供一个服务器网络凭证,然后通过WebRequest来验证连接是否成功。当然了,为了保存用户名与密码等的安全,可以对其进行加密等手段来保证其安全。

 以下是主要源代码:

  Code


  1 /** 
  2 /// 服务器网络凭证
  3 /// 
  4 /// 
  5 public static NetworkCredential MyCred()
  6 {
  7 string loginUser = Properties.Settings.Default.UserName;//用户名
  8 string loginPSW = Properties.Settings.Default.UserPSW;//密码
  9 string loginHost = Properties.Settings.Default.HostName;//主机名,可以是IP地址,也可以服务器名称
  10 NetworkCredential myCred = new NetworkCredential(loginUser,loginPSW, loginHost);
  11 //NetworkCredential myCred = new NetworkCredential("username", "123456", "yourip");//"username", "123456", "yourservername"
  12 return myCred;
  13 }
  14 /** 
  15 /// 验证是否成功连接到服务器,若连接成功,则返回TRUE
  16 /// 
  17 /// 服务器WebService URL
  18 /// 
  19 public static bool Credential(string url)
  20 {
  21 //定义局部变量
  22 string url = G_Url;//2009-02-25 陈辉聪 服务器验证只验证到机器
  23
  24 try
  25 {
  26 if (myWebResponse == null)
  27 {
  28 WebRequest myWebRequest = WebRequest.Create(url);//根据URL创建一个连接请求
  29 myWebRequest.Credentials = MyCred();//获取验证的凭证,这是最重要的一句
  30 myWebRequest.Timeout = 20000;//单位为毫秒
  31
  32 myWebResponse = myWebRequest.GetResponse();//返回连接成功时的信息
  33 }
  34 }
  35 catch (WebException wex)//无法连接到服务器,可能是因为服务器错误或用户名与密码错误
  36 {
  37 if (myWebResponse != null)//毁销
  38 {
  39 myWebResponse.Close();
  40 myWebResponse = null;
  41 }
  42
  43 return false;
  44 }
  45 catch (Exception ex)
  46 {
  47 if (myWebResponse != null)
  48 {
  49 myWebResponse.Close();
  50 myWebResponse = null;
  51 }
  52
  53 return false;
  54
  55 }
  56 finally
  57 {
  58 }
  59
  60 return true;
  61 }
  62
  63 private static WS_Webasic.WS_Webasic webasic =null;//实现华WS_Webasic.WS_Webasic
  64
  65 /** 
  66 /// WS_Webasic初始化
  67 /// 
  68 public static WS_Webasic.WS_Webasic WS_Webasic
  69 {
  70 get
  71 {
  72 if (webasic == null)//若webasic 为空,则重新实例化,这样可以减少验证的时间,提高效率
  73 {
  74 //webasic = new ZEDI.WS_Webasic.WS_Webasic();
  75 //wsBool = Credential(webasic.Url);//URL改为服务器地址 2009-02-25 陈辉聪 chhuic@163.com
  76 wsBool = Credential(G_Url);
  77 if (wsBool == true) //服务器连接验证通过
  78 {
  79 webasic = new WS_Webasic.WS_Webasic();//实例化
  80 webasic.Credentials = MyCred();//得到服务器连接凭证,这样该WebService可以放心的连接了
  81 }
  82 }
  83 return webasic;
  84 }
  85 }

  注:

  (1)必须引用 System.Net;

  (2)对WebService发访问,在IIS里取消匿名访问权限,若允许匿名访问,就没有必须提供验证凭证了。IIS里怎么取消匿名访问 权限请参照IIS相关文章,这里不在累赘。

  验证是有时速度会比较慢,主要是因为myWebResponse = myWebRequest.GetResponse();时速度比较慢,若有更好的方法验证网络连接是否成功的话,请告诉我,呵呵。。。

  通过以上的实现,就实现了WebService的安全访问问题,若还有更好的方法,不吝赐教

 

转载于:https://www.cnblogs.com/wangpei/archive/2010/05/27/1745421.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/379201.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

递归-计算字符串长度(代码、分析、汇编)

目录&#xff1a;代码&#xff1a;分析&#xff1a;汇编&#xff1a;代码&#xff1a; main.c #include <stdio.h>//该程序用递归计算字符串长度int strlen(const char* s) {if( s NULL ){return -1;}else if( *s \0 ){return 0;}else{return strlen(s1) 1;} }int m…

Java LinkedList void clear()方法与示例

LinkedList void clear()方法 (LinkedList void clear() method) This method is available in package java.util.Collection and here, Collection is an interface. 该方法在java.util.Collection包中可用&#xff0c;在这里&#xff0c; Collection是一个接口。 This metho…

Python-杨辉三角

在控制台输出如图所示一个8层的杨辉三角。 杨辉三角介绍&#xff1a; 每个数等于它上方两数之和 每行数字左右对称&#xff0c;由1开始逐渐变大 第n行的数字有n项&#xff0c;将n取8 def yanghui(n):l[1,1]for x in range(1,n):for a in range(x):l[a]l[a]l[a1]l.insert(0,1)…

如何向妻子解释OOD(转)

前言 此文译自CodeProject上<How I explained OOD to my wife>一文&#xff0c;该文章在Top Articles上排名第3&#xff0c;读了之后觉得非常好&#xff0c;就翻译出来&#xff0c;供不想读英文的同学参考学习。 作者(Shubho)的妻子(Farhana)打算重新做一名软件工程师(她…

不安全代码和指针资料汇编

不安全代码和指针&#xff08;C# 编程指南&#xff09;为了保持类型安全&#xff0c;默认情况下&#xff0c;C# 不支持指针运算。不过&#xff0c;通过使用 unsafe 关键字&#xff0c;可以定义可使用指针的不安全上下文。有关指针的更多信息&#xff0c;请参见主题指针类型。 注…

ffmpeg-从flv文件中提取AAC音频数据保存为文件

AAC ADTS格式协议&#xff1a; 从flv文件中提取AAC音频数据保存为文件。 如果需要详细了解AAC ADTS格式&#xff0c;可以查询文档。 原文件&#xff1a; 提取aac文件&#xff1a; main.c #include <stdio.h> #include <libavutil/log.h>> #include <lib…

Python-统计《水调歌头·明月几时有》字符出现次数。

统计《水调歌头明月几时有》字符出现次数。 明月几时有&#xff0c;把酒问青天。 不知天上宫阙&#xff0c;今夕是何年&#xff1f; 我欲乘风归去&#xff0c;又恐琼楼玉宇&#xff0c;高处不胜寒。 起舞弄清影&#xff0c;何似在人间&#xff01; 转朱阁&#xff0c;低绮户&am…

Linux网络编程入门 (转载)

(一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端 网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户端 在网络程序中&#xff0c;如果一个程序主动和外面的程序通信&#xff0c;那么我们…

在Python中将字符串拆分为字符数组

Given a string and we have to split into array of characters in Python. 给定一个字符串&#xff0c;我们必须在Python中拆分为字符数组。 将字符串拆分为字符 (Splitting string to characters) 1) Split string using for loop 1)使用for循环分割字符串 Use for loop t…

SQL表值函数和标量值函数的区别 [转]

SQL表值函数和标量值函数的区别 写sql存储过程经常需要调用一些函数来使处理过程更加合理&#xff0c;也可以使函数复用性更强&#xff0c;不过在写sql函数的时候可能会发现&#xff0c;有些函数是在表值函数下写的有些是在标量值下写的&#xff0c;区别是表值函数只能返回一个…

N Queen(代码、分析、汇编)

目录&#xff1a;代码&#xff1a;分析&#xff1a;汇编&#xff1a;代码&#xff1a; main.c #include <stdio.h>/* 程序描述&#xff1a;输出N*N中符合左右对角线与上下左右方向都没被使用的位置在每一行的所有情况使用检测左上角&#xff0c;正上角&#xff0c;右上…

kotlin 计算平方_Kotlin程序计算自然数之和

kotlin 计算平方Given a number number, and we have to calculate the sum of all natural numbers from 1 to number. 鉴于一些数字 &#xff0c;我们必须从1计算所有自然数的总和数量 。 Example: 例&#xff1a; Input:number 15Output:120用于计算Kotlin中自然数之和的…

Python-身份证核对

中华人民共和国居民身份证号码由17 位数字和1位校验码组成。其中&#xff0c;前6位为所在地编号&#xff0c;第7~14 位为出生年月日&#xff0c;第15~17位为登记流水号&#xff0c;其中第17位偶数为女性&#xff0c;奇数为男性。校验码的生成规则如下: 将前面的身份证号码17位数…

VC 加载套接字库

//加载套接字库 WORD wVersionRequested;//套接字库版本信息 WSADATA wsaData; int err; wVersionRequested MAKEWORD(1,1); err WSAStartup(wVersionRequested,&wsaData); if(err ! 0){ //加载失败 return; } if(LOBYTE(wsaData.wVersion) ! 1 || //判断是不是所请求的…

统计各种字符个数

#include <stdio.h> #include <conio.h>int main(int argc, char * argv[]) {char ch;int letters 0, space 0, digit 0, others 0;printf("请输入一组字符串:\n");while((chgetchar())!\n){if(ch>a && ch < z || ch >A &&…

树存储结构(代码、分析、汇编)

目录&#xff1a;代码&#xff1a;分析&#xff1a;汇编&#xff1a;代码&#xff1a; LinkList.h LinkList.c 线性表 GTree.h #ifndef _GTREE_H_ #define _GTREE_H_typedef void GTree;//定义树类型 typedef void GTreeData;//定义节点中存放数据的类型 typedef void (GTre…

Python-《twinkle twinkle little star》统计单词出现次数

统计英文儿歌《twinkle twinkle little star》中&#xff0c;使用到的单词及其出现次数。要求去除单词大小写的影响&#xff0c;不统计标点符号的个数&#xff0c;并按降序输出。 Twinkle, twinkle, little star, How I wonder what you are! Up above the world so high, Like…

二元矩阵峰值搜索_好斗的牛(二元搜索)

二元矩阵峰值搜索A farmer has built a long barn with N stalls. The stalls are placed in a straight manner at positions from x1, x2, ...xN. But his cows (C) are aggressive and don’t want to be near other cows. To prevent cows from hurting each other, he wan…

WinForm Paenl里面添加Form

Form7 f7 new Form7();f7.TopLevel false;f7.Parent this.panel1;this.panel1.Controls.Add(f7);f7.Show();转载于:https://www.cnblogs.com/Haibocai/archive/2012/10/30/2746003.html

跳跃表SkipList

跳跃表(Skip List)是一种随机化数据结构&#xff0c;基于并联的链表&#xff0c;其效率可比拟于二叉查找树(对于大多数操作需要O(log n)平均时间)。 基本上&#xff0c;跳跃列表是对有序的链表增加上附加的前进链接&#xff0c;增加是以随机化的方式进行的&#xff0c;所以在列…