Hetter

webservice 用户验证 加密

最近一直在自学webservice,并且通过学习之后做了一个案例,基于WebService的用户身份验证;但是做了很长时间老是出现一下问题:System.Web.Services.Protocols.SoapException: 服务器无法处理请求。

希望博客园里边的朋友帮忙解决一下,先谢谢啦,有机会请请.

代码如下:

/// <summary>

/// UserHeader 的摘要说明(封装了用户名和密码)

/// </summary>

public class UserHeader : SoapHeader

{

    public UserHeader()

    {

    }

    string name;

    string pwd;

    public string Name { get { return name; } set { name = value; } }

    public string Pwd { get { return pwd; } set { pwd = value; } }

}

WebService:

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

[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]

public class VerifyUserService : WebService

{

    public UserHeader _userHeader;

    public UserHeader UserHeader

    {

        get { return _userHeader; }

        set { _userHeader = value; }

    }

    public VerifyUserService()

    {

    }

    [SoapHeader("_userHeader", Direction = SoapHeaderDirection.InOut)]

    [WebMethod]

    public string ReturnLoginUser()

    {

        string Msg = string.Empty;

        if (_userHeader == null)

            Msg = "未初始化Web客户端实例";

        else

        {

            string name = DataProtect.Decrypt(_userHeader.Name);//在服务器端进行解密

            string pwd = DataProtect.Decrypt(_userHeader.Pwd);//在服务器端进行解密

            string sql = "select count(*) from USERINFO where Name=:Name and PWD=:Pwd";

            OleDbParameter[] cmdParameters ={ new OleDbParameter(":Name", OleDbType.VarChar, 10), new OleDbParameter(":Pwd", OleDbType.VarChar, 10) };

            cmdParameters[0].Value = name;

            cmdParameters[1].Value = pwd;

            object result = OraDBHelper.ExecuteScalarSql(sql, cmdParameters);

            if (!string.IsNullOrEmpty(result.ToString()))

            {

                if (int.Parse(result.ToString()) > 0)

                    Msg = "login success";

                else

                    Msg = "login failed";

            }

        }

        return Msg;

    }

}


WebService客户端:

 class Program

    {

        static void Main(string[] args)

        {

            Console.WriteLine("please input your name");

            string name = Console.ReadLine();

            Console.WriteLine("please input your password");

            string pwd = Console.ReadLine();

            UserHeader _uh = new UserHeader();          

            _uh.Name = DataProtect.Encrypt(name);//传输之前先加密

            _uh.Pwd = DataProtect.Encrypt(pwd);   //传输之前先加密         

            VerifyUserService vus = new VerifyUserService();

            vus.UserHeaderValue = _uh;

            string result = vus.ReturnLoginUser();//返回验证信息

            Console.WriteLine("your login msg:{0}", result);

            Console.ReadLine();

        } 

我的思路:将用户名和密码封装到SOAPHEADER,然后在传输之前对该SoapHeader进行加密,WebService服务器端进行解密,然后验证信息是否正确.

我的加密类:用的是对称加密.代码如下:

 public class DataProtect

    {

        public DataProtect()

        {

            //

            // TODO: 在此处添加构造函数逻辑

            //

        }

        private static string key;

        private static string iv;


        public static string Key

        { get { return key; } }


        public static string Iv

        {

            get { return iv; }


        }


        /// <summary>

        /// 随机生成密钥和初始化向量

        /// </summary>

        /// <returns></returns>

        private static string GetKeyOrIv()

        {

            StringBuilder sb = new StringBuilder();


            Random r = new Random();

            while (sb.ToString().Length < 8)

            {

                int number = r.Next(10);

                sb.Append(number);

            }


            return sb.ToString();

        }

        private static byte[] GetBytes(string str)

        {

            Encoding e = Encoding.Default;

            byte[] result = e.GetBytes(str);

            return result;

        }

        private static string GetString(byte[] b)

        {

            StringBuilder sb = new StringBuilder();

            for (int i = 0; i < b.Length; i++)

            {


                sb.Append(b[i].ToString("x2"));


            }

            return sb.ToString();


        }

        /// <summary>

        /// 加密数据(对称)

        /// </summary>

        /// <param name="txt">加密文本</param>

        /// <returns></returns>

        public static string Encrypt(string txt)

        {  key = "12345678";

            iv = "12345678";

            byte[] key1 = GetBytes(key);

            byte[] iv1 = GetBytes(iv);

            SymmetricAlgorithm sa = new DESCryptoServiceProvider();

            MemoryStream ms = new MemoryStream();

            CryptoStream cs = new CryptoStream(ms, sa.CreateEncryptor(key1, iv1), CryptoStreamMode.Write);

            StreamWriter sw = new StreamWriter(cs);

            sw.WriteLine(txt);

            sw.Close();

            cs.Close();

            byte[] result = ms.ToArray();

            ms.Flush();

            ms.Close();

            return GetString(result);

        }


        /// <summary>

        /// 解密数据(对称)

        /// </summary>

        /// <param name="txt"></param>

        /// <returns></returns>

        public static string Decrypt(string txt)

        {

            key = "12345678";

            iv = "12345678";

            byte[] key1 = GetBytes(key);

            byte[] iv1 = GetBytes(iv);

            SymmetricAlgorithm sa = new DESCryptoServiceProvider();

            MemoryStream ms = new MemoryStream(GetBytes(txt));

            CryptoStream cs = new CryptoStream(ms, sa.CreateDecryptor(key1, iv1), CryptoStreamMode.Read);

            StreamReader sr = new StreamReader(cs);

            string result = sr.ReadLine();

            sr.Close();

            cs.Close();

            ms.Close();

            return result;

        }

    }

希望园子里的朋友帮忙解决一下,这个问题困扰了我好久,从网上查找资料也没有解决掉,在一次谢谢大家了

我的邮箱:slj1024@gmail.com

posted on 2009-03-31 15:36 Hetter 阅读(1588) 评论(9) 编辑 收藏

评论

#1楼 2009-03-31 15:49 小 强      

SoapHeaderDirection 改成 In 试试看  回复 引用 查看   

#2楼 2009-03-31 15:51 博客园团队      

提问的文章不允许放在首页。
请在博问(http://space.cnblogs.com/q)中提问。
感谢您对博客园的支持!
 回复 引用 查看   

#3楼[楼主] 2009-03-31 16:02 Hetter      

刚才试过了,也还是不行.谢谢@小 强
 回复 引用 查看   

#4楼[楼主] 2009-03-31 16:03 Hetter      

好的@博客园团队
 回复 引用 查看   

#5楼 2009-03-31 16:07 小 强[未注册用户]

修改了之后,代理类是否有更新过?
下断点调试你的web服务。
 回复 引用   

#6楼[楼主] 2009-03-31 16:29 Hetter      

更新过,调试时候出现以上错误还有CryptographicException异常不正确的数据@小 强
 回复 引用 查看   

#7楼 2009-03-31 16:30 小 强      

那就是你加解密的方法有问题了,或者你数据没有正确传递到服务端。  回复 引用 查看   

#8楼[楼主] 2009-03-31 20:08 Hetter      

谢谢兄弟啦,我已经解决掉了,就是服务器端解密的时候出现问题了@小 强
 回复 引用 查看   

#9楼 2009-10-22 16:26 云莫远山      

@Hetter

能不能提示下错在哪里咯?运行了你的代码,它报的是System.Security.Cryptography.CryptographicException: 不正确的数据。这个错误~~不知该如何解决?
 回复 引用 查看   

<2009年3月>
22232425262728
1234567
891011121314
15161718192021
22232425262728
2930311234

导航

统计

公告

昵称:Hetter
园龄:3年2个月
粉丝:0
关注:0

搜索

 
 

常用链接

我的标签

随笔档案

相册

最新评论