用soapExtension验证webservice用户, 浏览器为何能跳过验证?

最近在做webService接口认证的东东。网上搜了一把,推荐使用SOAPHeader 或 SoapExtensionAttribute来验证合法用户。

1. SOAPHeader 

        只用soapheader的话没问题,ajax访问,浏览器直接调用都能正常走进验证方法里。

因为验证方法是写在web method里面的,感觉和业务逻辑混合了,不太科学,没有SoapExtensionAttribute 写在ProcessMessage里好。


2.SoapExtensionAttribute 

        这种方式认证逻辑分离出来,写在ProcessMessage方法里,感觉比较科学。Ajax调用能正常走进验证逻辑里,但是直接用浏览器调用WebService的话,就跳过验证了,直接去调我们的web method了。是哪儿配置不正确导致的吗?请大神赐教。

--------------------------------------------------------------------------

主要代码:

1.SOAPHeader 

        private LoginHeader _loginHeader = new LoginHeader();

        [WebMethod(EnableSession = true)]
        [SoapHeader("MyLoginHeader")]
        public string HelloA()
        {
            string validationMsg;


            if (!MyLoginHeader.IsValid(Context, out validationMsg)) // 认证逻辑封装在soapheader里面
            {
                return validationMsg;//返回错误信息  
            }


            return "Hello A :" + Context.Session.SessionID + " " + DateTime.Now.ToString();
        }


2.SoapExtensionAttribute 

--webService----------------------------------------------------------------------------

        public LoginHeader header;


        [WebMethod]
        [LoginAttribute] // 验证逻辑在这里
        [SoapHeader("header", Direction = SoapHeaderDirection.In)]
        public string HelloWorld()
        {
            return "Hello World :" + DateTime.Now.ToString();


        }

--class LoginAttribute----------------------------------------------------------------------------

    [AttributeUsage(AttributeTargets.Method)]
    public class LoginAttribute : SoapExtensionAttribute
    {
        int _priority = 1;


        public override int Priority
        {
            get { return _priority; }
            set { _priority = value; }
        }


        public override Type ExtensionType
        {
            get { return typeof(LoginExtension); }
        }
    }

--class LoginExtension ----------------------------------------------------------------------------

public class LoginExtension : SoapExtension
    {
        public override void ProcessMessage(SoapMessage message)
        {
            switch (message.Stage)
            {   case SoapMessageStage.BeforeSerialize:
                case SoapMessageStage.AfterSerialize:
                case SoapMessageStage.BeforeDeserialize:
                    break;
                case SoapMessageStage.AfterDeserialize:
                    CheckLoginUser(message); // 验证逻辑在这里
                    break;
                default:
                    throw new Exception("invalid stage");
            }
        }
        public override Object GetInitializer(Type type)
        {
            return GetType();
        }
        public override Object GetInitializer(LogicalMethodInfo info, SoapExtensionAttribute attribute)
        {
            return null;
        }
        public override void Initialize(Object initializer)
        {
        }
    }

奇怪的就是Ajax调用HelloWorld()的时候能走进ProcessMessage(),浏览器调用直接到HelloWorld()方法里去了,跳过了ProcessMessage()验证....

请大神们解下惑 ~ ~

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭