Skip to main content

Double Hope Issue in Sharepoint/Asp.net application with IIS

This is a common issue called Double Hope issue in IIS and troubles most Sharepoint / Asp.net application which consume the resource in other servers .In application development most of the one talks to different application resides in multiple servers.

Problem
This issue occurs when you try to access the resource outside server with current logged in user credentials. In this scenario first hope occurs when user access the page from client browser that time its authenticate the user with his own windows credentials. The second hope occurs when IIS try to access the other server with the current user credential. In SharePoint world most of the application uses windows authentication to authenticate the user and impersonation also set to true. Our application want talk to other application.Let say for example a webservice in another physical server or a sharepoint service in another Farm .In this scenario during the second hope IIS will pass the credentials with hashed password ,so the other server cannot understand credentilal.


You could also read more about this issue in msdn http://msdn.microsoft.com/en-us/library/ms817871
How to solve the issue
Approach 1 : Use Same Encryption and Decryption
Use same encryption and decryption key in web.config of both servers. This way we could force the servers to use the same key.
< machineKey
validationKey ="21F090935F6E49C2C797F69BBAAD8402ABD2EE0B667A8B44EA7DD4374267A75D7
AD972A119482D15A4127461DB1DC347C1A63AE5F1CCFAACFF1B72A7F0A281B"
decryptionKey ="ABAA84D7EC4BB56D75D217CECFFB9628809BDB8BF91CFCD64568A145BE59719F"
validation ="SHA1"
decryption ="AES"
/>
Read more about it http://msdn.microsoft.com/en-us/library/ff649308.aspx





Approach 2 : Use IIS Application Pool Identity User
In this approach we need to use the application pool identity user for communication with other server. Here we change impersonation context application pool identity user when we communicate with the other applications.After the consumption of other application we will revert back to the current user.

WindowsImpersonationContext appPoolContext = null;
//Imperosonate application pool UserIdentity
appPoolContext = WindowsIdentity.Impersonate(System.IntPtr.Zero);
//**************
//Call all the web services here
//************
//After the execution revert back to current user
appPoolContext.Undo();

Approach 3 : Communicate with specific user credential
Another approach you could communicate with specific domain user credential. In this approach we will be setting the credential explicitly to a specific domain user by passing user name and password. In this approach you could keep

//Create the service client
MyWebServiceclient = new MyvewebserviceViews(weburl + "/_vti_bin/views.asmx");
//Set the credential of a domain user
MyWebServiceclient.Credentials = new System.Net.NetworkCredential("MyUser", "Password", "domain");
//Call the service
MyWebServiceclient.GetView(listname, viewName);
You could keep the user information in web.config and encrypt it.
1. Creat web.config entry
< section name ="UserInfoSection"
type ="System.Configuration.SingleTagSectionHandler"/>

< UserInfoSection username ="value1" password ="value2" domain ="value3"/>

2. Encrypt the section
Go to visual studio command prompt and run
aspnet_regiis –pef UserInfoSection

3. Read the value from code

MyUserData = (System.Collections.IDictionary)
System.Configuration.ConfigurationSettings.GetConfig(" UserInfoSection ");

Comments

  1. Nice post , Thanks for sharing Gte more update at
    .Net Online Course Hyderabad

    ReplyDelete
  2. Thanks for such a great article here. I was searching for something like this for quite a long time and at last, I’ve found it on your blog. It was definitely interesting for me to read about their market situation nowadays.AngularJS Training in Chennai | Best AngularJS Training Institute in Chennai

    ReplyDelete
  3. I appreciate your clear explanations and the outstanding alignment of your content with your blog! I strongly recommend visiting the website below if you're interested in sharing your work.
    Italy study visa consultants in hyderabad

    ReplyDelete

Post a Comment

Popular posts from this blog

How to find Sharepoint DB

In sharepoint world you should know where the sharepoint database is to trouble shoot database related issues.Some one come to you and say i am getting unable to connect to database error or my sharepoint is down.So you may not know the details of the environment.In first step you need to identify the  servers so you have to find the configdb and content db servers. How to find the Config DB Configuration database connection string is stored in Registry key. So sharepoint look for that entry to identify the database. In Sharepoint 2007 you could see the config DB conection string in Following Registry Key My Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Shared Tools\Web Server Extensions\12.0\Secure\ConfigDb In Sharepoint 2010 you could see the config DB conection string in Following Registry Key My Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Shared Tools\Web Server Extensions\14.0\Secure\ConfigDb The Next thing you have to find the Content DB attached to Web application.

Ajax Integration with sharepoint

Master Page 1. Add the following tag just below the form tag of master page <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePartialRendering="true" /> Web.Config 1. Add safe control <SafeControl Assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" Namespace="System.Web.UI" TypeName="*" Safe="True" /> 2. Add the http handler inside <httpHandlers> tag of web.config <add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> <add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"

Creating Custom Timer Job

Timer Job is something which comes into mind when you are looking for batch process in sharepoint.In most of the realtime sharepoint site requires Pulling data from some other application and update the data in sharepoint.In some other scenario we need to synchronize information or Updata date in every day, or give the admin a flexibility execute some batch processing.Its realy good idea to create a Custom Scheduled Job.Let see a Basic skelton code. using Microsoft.SharePoint; using Microsoft.SharePoint.Administration; //Class should inherit from  SPJobDefinition Public class SampleJob :  SPJobDefinition {        //You could Define Custom properties         [Persisted()]         public string MyCustomProperty; ///Implement Following three constructors public SampleJob (): base(){  } public SampleJob (string jobName, SPService service, SPServer server, SPJobLockType targetType): base (jobName, service, server, targetType) { } public SampleJob (string jobName, SPWebAp