关闭

使用Soap头自定义身份验证

471人阅读 评论(0) 收藏 举报
在intranet场景下,Windows身份验证动作良好,并且开发人员可以在自身域中对用户进行身份验证。如果在Web.config文件中将WEB服务设置为WINDOWS身份验证模式,那么必须为每一个用户创建一个本地几户或域账户。对于拥有大量用户的应用程序来说,这不是一个实用的解决方案,美工豕对于Internet上的应用程序来说这是不可能实现的。对Internet而言,可能需要根据结构化查询语言(SQL)数据库来执行自定身份验证和授权。在这种情况下应该向WEB传递自定凭据(例如用户名或密码),并让WEB服务处理身份验证和授权。
    这时候我可以用一种比较简便的方法--使用SOAP头。WEB服务消费者在SOAP头中添加用户ID和密码信息,WEB服务方法会检索这些信息,并使用这些信息来执行自定义的验证从而调用相应的服务 。

下面是一个简单的例子:

服务器端:
using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;

using System.Security.Principal;
namespace test2
{
    
/// <summary>
    
/// Summary description for Service1
    
/// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo 
= WsiProfiles.BasicProfile1_1)]
    [ToolboxItem(
false)]
    
public class Service1 : System.Web.Services.WebService
    {
       
       
public  ValidateUser valiUser = new ValidateUser();//一定要是public访问类型。

      


        
//
        [SoapHeader("valiUser")]
        [WebMethod]
        
public string GetAuthority()
        {
            
string Msg="";
            valiUser.ValiHeader(
out Msg);
            
return Msg;
        }
    }
    
//
    public class ValidateUser:System.Web.Services.Protocols.SoapHeader
    {
        
//用户名和密码
        private string username;
        
private string password;
        
//
        public string UserName
        {
            
get { return username; }
            
set { username = value; }
        }
        
//
        public string PassWord
        {
            
get { return password; }
            
set { password = value; }
        }
        
//
        public bool ValiHeader(out string ReturnMsg)
        {
            
bool flag = false;
            
if (UserName == "admin" && PassWord == "admin")
            {
                flag 
= true;
                ReturnMsg 
= "You Are Successfully";
            }
            
else
            {
                ReturnMsg 
= "You Are Failted";
            }
            
return flag;
        }
    }

 客户端:(我是写在一个按钮下面,向浏览器输出)
 protected void Button2_Click(object sender, EventArgs e)
        {
            Service1 service 
= new Service1();
            ValidateUser valiUser 
= new ValidateUser();
            valiUser.UserName 
= "admin";
            valiUser.PassWord 
= "admin";
            service.ValidateUserValue 
= valiUser;
            Response.Write(service.GetAuthority());
        }

输出为:“You Are Successfully”
注意:要使用SOAP头实现一个自定义身份验证方案,还必须在WEB服务的web.config文件中禁用其他的身份验证类型,如下所示:
<configuration>
    <system.web>
       <authentication mode="None"/>
    </system.web>
</configuration>  

当使用SOAP头传输凭据时,惟一必须解决的重要问题就是安全了,不过我们可以将SOAP头中身份信息进行强加密来解决这个问题。
这将在我下一片文章中出现。
   
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:405802次
    • 积分:7486
    • 等级:
    • 排名:第2994名
    • 原创:334篇
    • 转载:23篇
    • 译文:1篇
    • 评论:52条
    文章分类
    最新评论