Solved

soapheader is null in webservice

Posted on 2013-02-06
1
1,509 Views
Last Modified: 2013-02-07
When I call my webservice and authenticate user, an authorisation token is set and I can see the token value while debugging. After the token is set when I try to call a method, the method checks for that token but the value for that token is null.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Data.SqlClient;
using System.Data;
using HPS.Core;
using HPS.Thesaurus.BusinessObject;
using HPS.Thesaurus.BusinessObject.Collections;
using System.Web.Script.Services;
using System.Web.Services.Protocols;
namespace TaxonomyWebService
{

    /// <summary>
    /// Soap Header for the Secured Web Service.
    /// Username and Password are required for AuthenticateUser(),
    ///   and AuthenticatedToken is required for everything else.
    /// </summary>
    public class TaxonomyWebServiceHeader : System.Web.Services.Protocols.SoapHeader
    {
        public string Username;
        public string Password;
        public string AuthenticatedToken;
    }
    
    /// <summary>
    /// Summary description for NESTaxonomyWS
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
     [System.Web.Script.Services.ScriptService]
    public class NESTaxonomyWS : System.Web.Services.WebService
    {
        public TaxonomyWebServiceHeader SoapHeader;

        [WebMethod]
        [SoapHeader("SoapHeader")]
        public string AuthenticateUser()
        {
            if (SoapHeader == null)
                return "Please provide a Username and Password";
            if (string.IsNullOrEmpty(SoapHeader.Username) || string.IsNullOrEmpty(SoapHeader.Password))
                return "Please provide a Username and Password";
            // Are the credentials valid?
            if (!IsUserValid(SoapHeader.Username, SoapHeader.Password))
                return "Invalid Username or Password";
            // Create and store the AuthenticatedToken before returning it
            string token = Guid.NewGuid().ToString();
            HttpRuntime.Cache.Add(token,SoapHeader.Username,null,System.Web.Caching.Cache.NoAbsoluteExpiration,TimeSpan.FromMinutes(60), System.Web.Caching.CacheItemPriority.NotRemovable,null);
            return token;
        }

        private bool IsUserValid(string Username, string Password)
        {
            // TODO: Implement Authentication

            
            return true;
        }

        private bool IsUserValid(TaxonomyWebServiceHeader SoapHeader)
        {
            if (SoapHeader == null)
                return false;
            return true;
            // Does the token exists in our Cache?
            //if (!string.IsNullOrEmpty(SoapHeader.AuthenticatedToken))
            //    return (HttpRuntime.Cache[SoapHeader.AuthenticatedToken] != null);
            //return false;
        }




        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        [SoapHeader("SoapHeader")]
        public List<Term> GetTopLevelTerms()
        {
            if (IsUserValid(SoapHeader))
            {
                List<Term> tl = new List<Term>();
                DataTable dt = new DataTable();
                string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["ThesaurusConnectionString"].ConnectionString;

                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    connection.Open();
                    SqlCommand cmd = new SqlCommand("Term_GetTopLevelTerm", connection);
                    cmd.CommandType = CommandType.StoredProcedure;

                    SqlDataAdapter da = new SqlDataAdapter(cmd);

                    da.Fill(dt);

                    if (dt.Rows.Count > 0)
                    {
                        int count = 0;
                        foreach (DataRow dr in dt.Rows)
                        {

                            tl.Add(FillData(dr));

                            count++;
                        }
                    }

                }


                return tl;
            }
            else
            {

                return null;

            }
        }
        }

Open in new window


The web service client

 protected void btnOk_Click(object sender, EventArgs e)
    {
        NESTaxonomyWSRef.NESTaxonomyWSSoapClient Obj = new NESTaxonomyWSRef.NESTaxonomyWSSoapClient();

        NESTaxonomyWSRef.TaxonomyWebServiceHeader headerObj= new NESTaxonomyWSRef.TaxonomyWebServiceHeader();

        headerObj.Username="hello";
        headerObj.Password="user";



       var v1=Obj.AuthenticateUser(headerObj);
       headerObj.AuthenticatedToken = v1.ToString();
       var v= Obj.GetTopLevelTerms();

       
        
    }

Open in new window

0
Comment
Question by:mmalik15
1 Comment
 
LVL 16

Accepted Solution

by:
Rose Babu earned 500 total points
ID: 38859930
Here is an updated working code as you wanted. also update IsUserValid function with the necessary checking.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Web.Script.Services;

namespace WebService_CSHARP
{    
    /// <summary>
    /// Soap Header for the Secured Web Service.
    /// Username and Password are required for AuthenticateUser(),
    ///   and AuthenticatedToken is required for everything else.
    /// </summary>
    public class TaxonomyWebServiceHeader : System.Web.Services.Protocols.SoapHeader
    {
        public string Username;
        public string Password;
        public string AuthenticatedToken;
    }

    /// <summary>
    /// Summary description for EE_TaxonomyService
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
    [System.Web.Script.Services.ScriptService]
    public class EE_TaxonomyService : System.Web.Services.WebService
    {
        public TaxonomyWebServiceHeader SoapHeader;
        
        private bool IsUserValid(string Username, string Password)
        {
            // TODO: Implement Authentication
			// Update this function 
            if (Username == "test" && Password == "test")
            {
                return true;
            }
            else
            {
                return false;
            }            
        }

        private bool IsUserValid(TaxonomyWebServiceHeader SoapHeader)
        {
            if (SoapHeader == null)
                return false;
            return true;
            // Does the token exists in our Cache?
            //if (!string.IsNullOrEmpty(SoapHeader.AuthenticatedToken))
            //    return (HttpRuntime.Cache[SoapHeader.AuthenticatedToken] != null);
            //return false;
        }

        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        [SoapHeader("SoapHeader")]
        public string GetToken()
        {
            if (SoapHeader == null)
                return "Please provide a Username and Password";
            if (string.IsNullOrEmpty(SoapHeader.Username) || string.IsNullOrEmpty(SoapHeader.Password))
                return "Please provide a Username and Password";
            // Are the credentials valid?
            if (!IsUserValid(SoapHeader.Username, SoapHeader.Password))
                return "Invalid Username or Password";
            



            // Create and store the AuthenticatedToken before returning it
            string token = Guid.NewGuid().ToString();
            HttpRuntime.Cache.Add(token, SoapHeader.Username, null, System.Web.Caching.Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(60), System.Web.Caching.CacheItemPriority.NotRemovable, null);
            
            return token;            
        }


    }
}

Open in new window

i used test authentication. use test as username and test as password for this sample code. This works for me.

Just try this.
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

New Relic recently released its Synthetics product that allows for the creation of performance monitors that periodically test a site's performance. If you wish to test an interactive workflow New Relic employs Selenium WebDriverJS to run those test…
It was really hard time for me to get the understanding of Delegates in C#. I went through many websites and articles but I found them very clumsy. After going through those sites, I noted down the points in a easy way so here I am sharing that unde…
The purpose of this video is to demonstrate how to set up the WordPress backend so that each page automatically generates a Mailchimp signup form in the sidebar. This will be demonstrated using a Windows 8 PC. Tools Used are Photoshop, Awesome…
Video by: Mark
This lesson goes over how to construct ordered and unordered lists and how to create hyperlinks.

912 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

20 Experts available now in Live!

Get 1:1 Help Now