Welcome to MSDN Blogs Sign in | Join | Help

workaround to the issue with the DataSheet View (if you have custom master page)

On creating a new ‘Datasheet View’ in a simple OOB Custom List or Document Library (where System master page is a custom master page) leads to either a hang (IE8) or an infinite loop (IE7)

Leading to ever growing of window height both resulting in a CPU crash.

During the script debugging found that the following are the two functions in Core.js which are going to infinite loop when custom master page with footer is present for the system pages.

GCWindowResize and GCOnResizeGridControl 

The workaround is to add counters in these two functions to overcome the infinite loop. The new functions would be as follows.

var win_resize_counter = 0;

        var obj_resize_counter = 0;

        function GCWindowResize(GCObject) {

 

            win_resize_counter++;

            if (win_resize_counter < 3) {

                if (TestGCObject(GCObject)) {

                    glGCResizeCounter = 0;

                    GCResizeGridControl(GCObject);

                }

            }

            else

                win_resize_counter = 0;

 

        }

        function GCOnResizeGridControl(GCObject) {

 

            obj_resize_counter++;

            if (obj_resize_counter < 2) {

                if (TestGCObject(GCObject)) {

                    if (glGCResizeCounter < cGCMaxGCResizeCount) {

                        glGCResizeCounter++;

                        GCResizeGridControl(GCObject);

                    }

                }

            }

            else

                obj_resize_counter = 0;

        }

For customizing the core.js in the supported way please find the below MSDN article

http://msdn.microsoft.com/en-us/library/cc768565.aspx

Posted by sowmyancs | 2 Comments

Issue with upgrading the web part pages created from the custom web part page template from SPS 2003 and MOSS 2007

Once I had worked with a case in which customer has created a custom web part page template in SPS 2003 as per the following MSDN article http://msdn.microsoft.com/en-us/library/dd583147.aspx. When customer upgraded from SPS 2003 to MOSS 2007 he found that the web part pages created in SPS 2003 based on the custom web part page templates are not upgraded correctly to MOSS 2007.

Their look and feel in MOSS 2007 is not similar to SPS 2003. As the issue is with the web part pages created from the custom web part page template we need to ensure that whether the mapping of custom web part page template is done correctly. Checked the Server under 12 hive whether custom web part page templates are available in MOSS 2007. The custom web part page templates are in place. Checked the Mapping file to verify whether the mapping of custom web part page template between SPS 2003 and MOSS 2007 is correct. The mapping is accurate between 60 hive and 12 hive of custom web part page templates.

Checked the “Docs” table in the MOSS 2007 content database to verify whether the set up path of the web part pages created from custom web part page template are accurate. But the “SetUpPath” column in the MOSS content database is NULL for the web part pages created from the custom web part page template. When we updated the “SetUpPath” column then the look and feel of this problematic pages are fixed as expected. As we cannot directly modify the database table checked with the SharePoint API to update this column in the database. But the “vti_SetupPath” property in the SPFile property bag is read only and we are unable to update its value using API. So decided to export t the web part pages created from the OOB web part page template to check the manifest.xml of this page. Then exported the web part pages created from the custom web part page template and checked the Manifest.xml. We found that the “vti_SetupPath” property is not set in the manifest.xml of the web part pages created from the custom web part page template. Decided to set this property in the manifest.xml and import it again to the web part pages library.

Following are the changes need to be done in the manifest.xml file of the affected web part pages after the export.  

  1.   Within the SharePoint list, get the list of items [Created using custom web part page template. Export all the list items using SharePoint Object model.  Though we can use stsadm command, its scope is restricted to web site only.  We are looking at list / list item levels.
  2. Once Export is successfully completed, delete the list items in the list [Those files which got exported]
  3. On Export, we get content migration package [This package gets stored in the location that we specify in the code ].
  4. The package consists of Manifest.XML file.  The xml file has the following tag.

 

<SPObject Id="23576837-bc5a-433f-9e38-93ba255dbb27" ObjectType="SPFile" ParentId="f95f1bdf-4459-4edf-8c3f-79820d73abd0"

 

                  ParentWebId="c93ce050-2346-4b0c-ab65-e997d5b326e3"

                  ParentWebUrl="/sites/Chandru"

                  Url="/sites/Chandru/Shared Documents/sowmyan6.aspx">

 

            <File Url="Shared Documents/sowmyan6.aspx" Id="23576837-bc5a-433f-9e38-93ba255dbb27" ParentWebId="c93ce050-2346-4b0c-ab65-e997d5b326e3" ParentWebUrl="/sites/Chandru" Name="sowmyan6.aspx" ListItemIntId="36" ListId="b51a6865-d9a8-41a5-b467-e00ab4d781d0" ParentId="f95f1bdf-4459-4edf-8c3f-79820d73abd0" TimeCreated="2009-04-09T20:32:16" TimeLastModified="2009-04-09T20:32:44" Version="1.0" IsGhosted="true" SetupPath="1033\STS\doctemp\smartpgs\spstd7.aspx" SetupPathVersion="3" SetupPathUser="1073741823" FileValue="00000000.dat" Author="1073741823"  ModifiedBy="1073741823">

                  <Properties>

                        <Property Name="vti_metatags" Type="StringVector" Access="ReadOnly" Value="GENERATOR Microsoft\\ SharePoint ProgId SharePoint.WebPartPage.Document HTTP-EQUIV=Content-Type text/html;\\ charset=utf-8 CollaborationServer SharePoint\\ Team\\ Web\\ Site" />

                        <Property Name="vti_cachednolayoutzones" Type="StringVector" Access="ReadOnly" Value="TitleBar" />

                        <Property Name="ContentTypeId" Type="String" Access="ReadWrite" Value="0x01010040A4775A0A71C7478867F9E357CD8475" />

                        <Property Name="vti_generator" Type="String" Access="ReadOnly" Value="Microsoft SharePoint" />

                        <Property Name="vti_cachedhastheme" Type="Boolean" Access="ReadOnly" Value="false" />

                        <Property Name="vti_cachednoperszones" Type="StringVector" Access="ReadOnly" Value="TitleBar" />

                        <Property Name="vti_cachedneedsrewrite" Type="Boolean" Access="ReadOnly" Value="false" />

                        <Property Name="vti_cachedzones" Type="StringVector" Access="ReadOnly" Value="TitleBar LeftColumn Header TopRow CenterLeftColumn CenterColumn CenterRightColumn Footer" />

                        <Property Name="vti_charset" Type="String" Access="ReadOnly" Value="utf-8" />

                        <Property Name="vti_parserversion" Type="String" Access="ReadOnly" Value="12.0.0.6335" />

                        <Property Name="ContentType" Type="String" Access="ReadWrite" Value="Document" />

                  </Properties>

                  <WebParts>

                        <WebPart Name="110ee2a6-d028-4d90-bbc1-bc19c8f885aa" AllUsersProperties="AQUAAAACKgBJACkAAz4AAAIqAEoAKQADPQAAAVUAYgAD//8bL19sYXlvdXRzL2ltYWdlcy93cGljb24uZ2lmDwFTAGIAA///BHRlc3QPDw==" Level="major" WebPartZoneID="TitleBar" WebPartTypeId="94e9c166-264a-f84b-2377-bccefb8b3771" IsIncluded="true" WebPartOrder="1" FrameState="0" />

                  </WebParts>

                  <Links>

                        <Link TargetId="d6f83029-a908-406f-981a-a93fdfcb618e" TargetUrl="/_layouts/images/blank.gif" IsDirty="false" />

                  </Links>

            </File>

 

      </SPObject>

5.  Do the above highlighted modifications (Add/Edit) in the manifest.xml file.

6.    Now, run the import code. [ Make sure that those files from SharePoint library are deleted before import is run.  Otherwise, the files  won’t be over written ].

7.    On successful import, the list item will now point to the correct template [As the setuppath of that item is rightly set]

Posted by sowmyancs | 1 Comments

SharePoint state machine workflow : some issues and work-arounds

In this post I am giving some possible issues that you may face while working with state machine workflow and the work around to resolve those issues.

Issue 1

=======

Sometimes, if you have a SharePoint state based workflow that has a DelayActivity and the DelayActivity never fire and error out eventually. The problem lies in the fact that the workflow calls  out to another DLL in the code activity following the DelayActivity. When the call is made a  " System.IO.FileNotFoundException: Could not load file or assembly" exception is raised (see below), though the DLL is in the GAC and has SafeControl entry in web.config. 

System.IO.FileNotFoundException: Could not load file or assembly 'Utilities, Version=1.0.0.0, Culture=neutral, PublicKeyToken=584ac65395d6cc3f' or one of its dependencies. The system cannot find the file specified. File name: 'Utilities, Version=1.0.0.0, Culture=neutral, PublicKeyToken=584ac65395d6cc3f' at RRURequestWorkflow.Workflow1.codeActivity2_ExecuteCode(Object sender, EventArgs e) at System.Workflow.ComponentModel.Activity.RaiseEvent(DependencyProperty dependencyEvent, Object sender, EventArgs e) at System.Workflow.Activities.CodeActivity.Execute(ActivityExecutionContext executionContext) at System.Workflow.ComponentModel.ActivityExecutor`1.Execute(T activity, ActivityExecutionContext executionContext) at System.Workflow.ComponentModel.ActivityExecutor`1.Execute...

Issue 2

=======

Some other occasions, if you have a state machine workflow with several activities. Whenever it reaches a delay activity, it throws following error in the ULS logs.

Engine RunWorkflow: System.Runtime.Serialization.SerializationException: Cannot get the member 'codeActivity1_ExecuteCode'.     at System.Reflection.MemberInfoSerializationHolder.GetRealObject(StreamingContext context)     at System.Runtime.Serialization.ObjectManager.ResolveObjectReference(ObjectHolder holder)     at System.Runtime.Serialization.ObjectManager.DoFixups()     at System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(HeaderHandler handler, __BinaryParser serParser, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)     at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream, HeaderHandler handler, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)     a...              

...t System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream)     at System.Workflow.ComponentModel.Activity.Load(Stream stream, Activity outerActivity, IFormatter formatter)     at System.Workflow.ComponentModel.Activity.Load(Stream stream, Activity outerActivity)     at System.Workflow.Runtime.Hosting.WorkflowPersistenceService.RestoreFromDefaultSerializedForm(Byte[] activityBytes, Activity outerActivity)     at Microsoft.SharePoint.Workflow.SPWinOePersistenceService.LoadWorkflowInstanceState(Guid instanceId)     at System.Workflow.Runtime.WorkflowRuntime.InitializeExecutor(Guid instanceId, CreationContext context, WorkflowExecutor executor, WorkflowInstance workflowInstance)     at System.Workflow.Runtime.WorkflowRuntime.Load(Guid key, Creation...           

...Context context, WorkflowInstance workflowInstance)     at System.Workflow.Runtime.WorkflowRuntime.GetWorkflow(Guid instanceId)     at Microsoft.SharePoint.Workflow.SPWinOeHostServices.Send(SPWinOeWorkflow winoeworkflow, SPWorkflowEvent e)     at Microsoft.SharePoint.Workflow.SPWinOeEngine.RunWorkflow(Guid trackingId, SPWorkflowHostService host, SPWorkflow workflow, Collection`1 events, TimeSpan timeOut)

 

 

 Engine RunWorkflow: System.Workflow.Activities.EventDeliveryFailedException: Event "OnWorkflowItemChanged" on interface type "Microsoft.SharePoint.Workflow.ISharePointService" for instance id "36fc71f8-c048-4306-bd29-8ad1aa02a5c4" cannot be delivered. ---> System.Runtime.Serialization.SerializationException: Cannot get the member 'phase7SendRequestorPrintView_MethodInvoking'.     at System.Reflection.MemberInfoSerializationHolder.GetRealObject(StreamingContext context)     at System.Runtime.Serialization.ObjectManager.ResolveObjectReference(ObjectHolder holder)     at System.Runtime.Serialization.ObjectManager.DoFixups()     at System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(HeaderHandler handler, __BinaryParser serParser, Boolean fCheck, Boolean isCrossAppDomain, I...        

...MethodCallMessage methodCallMessage)     at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream, HeaderHandler handler, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)     at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream)     at System.Workflow.ComponentModel.Activity.Load(Stream stream, Activity outerActivity, IFormatter formatter)     at System.Workflow.ComponentModel.Activity.Load(Stream stream, Activity outerActivity)     at System.Workflow.Runtime.Hosting.WorkflowPersistenceService.RestoreFromDefaultSerializedForm(Byte[] activityBytes, Activity outerActivity)     at Microsoft.SharePoint.Workflow.SPWinOePersistenceService.LoadWorkflowInstanceState(Gu...               

...id instanceId)     at System.Workflow.Runtime.WorkflowRuntime.InitializeExecutor(Guid instanceId, CreationContext context, WorkflowExecutor executor, WorkflowInstance workflowInstance)     at

System.Workflow.Runtime.WorkflowRuntime.Load(Guid key, CreationContext context, WorkflowInstance workflowInstance)     at System.Workflow.Runtime.WorkflowRuntime.GetWorkflow(Guid instanceId)     at System.Workflow.Activities.WorkflowMessageEventHandler.EventHandler(Object sender, ExternalDataEventArgs eventArgs)     --- End of inner exception stack trace ---     at System.Workflow.Activities.WorkflowMessageEventHandler.EventHandler(Object sender, ExternalDataEventArgs eventArgs)     at Microsoft.SharePoint.Workflow.SPWinOEWSSService.RaiseEvent(SPWinOeWorkflow workflow, SPWorkflowEvent workflowEvent, O... 

...bject workItem, IPendingWork workHandler)     at Microsoft.SharePoint.Workflow.SPWinOeHostServices.Send(SPWinOeWorkflow winoeworkflow, SPWorkflowEvent e)     at Microsoft.SharePoint.Workflow.SPWinOeEngine.RunWorkflow(Guid trackingId, SPWorkflowHostService host, SPWorkflow workflow, Collection`1 events, TimeSpan timeOut)

Resolution for Issue 1 & 2:

After restarting the “windows SharePoint timer service” the both the above issues will get resolve. Root cause was, whenever you have workflow that has got a delay activity, the event is fired by the service(SPTimerV3), before it fires, it has to load the assembly from its bin or from the GAC, only one file(module loads) based on the assembly information specified in workflow.xml file loads.

Deploying the new binary after changing the workflow activities, the SPTimerV3 is not aware of the newly added binary; it won’t reload it unless you do a time reset. Unless you do a reset, the persistence (serialization or de-serialization) or loading of assembly would fail due to mismatch of types.

Issue 3

=======

Whenever you initialize the timeoutduration of 2 delay activities in the InitializeTimeoutDuration event, the delay activity will not work as expected.

Eg:  private void delayActivity2_InitializeTimeoutDuration(object sender, EventArgs e)

        {

                delayActivity2.TimeoutDuration = TimeSpan.FromMinutes(3);

        }

Resolution for Issue 3:

In state machine workflow we can’t initialize the timeoutduration by using the object name of the delay activity (eg: delayActivity2.TimeoutDuration = TimeSpan.FromMinutes(3);) instead use the sender parameter of the InitializeTimeoutDuration event, which will always be the currently running instance of the Delay,  cast it to a DelayActivity and set the value on the TimeoutDuration property.

When a state is entered in the state machine (or when other workflow activities like the ReplicatorActivity, WhileActivity or ConditionedActivityGroup are executed) the workflow engine makes a clone of activities from your workflow definition and execute them instead of the activities in your workflow definition.  For this reason you can't just change the activity as you did but you have to change the instance that the workflow is actually executing. 

Here is the sample:

  private void delayActivity2_InitializeTimeoutDuration(object sender, EventArgs e)

        {

               // delayActivity2.TimeoutDuration = TimeSpan.FromMinutes(3);

               (sender as DelayActivity).TimeoutDuration = TimeSpan.FromMinutes(3);

        }

 

The sender will be the instance of the DelayActivity that the workflow is actually executing.

You also found that if you bind the timeout property to a dependency field it allows you to set the values using the instance field. 

Posted by sowmyancs | 1 Comments

Things to remember while creating custom content types through feature.

Sometimes you may face an issue that, once you create new content type it will not display it in the Site Content Types in the site collection. You can check these issues by analyzing the custom Ctypes.xml deeply. Make sure that the you are adding the content type IDs correctly.

 

Please check the below image for getting an idea about the format of the content type IDs.

 

 

If you create a new content type then the new content type GUID must need to add as a prefix to the inheriting content type ID by separating it by “00”

Posted by sowmyancs | 1 Comments

Issue with SharePoint designer workflow to start under System Acccount.

If you create a workflow in SharePoint designer and if you use choose “When create a project, auto start this workflow”, then you may see that the workflow is not starting once you add an item. The reason

 

This behavior occurs because a security fix in Windows SharePoint Services 3.0 SP1 prevents declarative workflows from starting automatically under the system account. After you install Windows SharePoint Services 3.0 SP1, declarative workflows do not start automatically if the following conditions are true:

· The Windows SharePoint Services Web application runs under a user's domain account.

· The user logs in by using this domain account.

· The site displays the user name as System Account.

The details of this issue and the work around has been documented in the following

 KB http://support.microsoft.com/kb/947284

 

Posted by sowmyancs | 1 Comments

Develop a youtube kind of site in SharePoint - PKS !

Do you want to create a youtube like site in your company with some cool look an feel and with short span of time then here you go : PodCasting kit of SharePoint. It is completely free and you can download the complete code from the open source community codeplex. Also you can see couple of demo in the form of video in codeplex.

You can visit the official blog of SharePoint for getting more information. I have tried it and it is really awesome J !

My hearty thanks to the people who developed and decided to provide this application to the public community.

Posted by sowmyancs | 1 Comments

How to create a custom Delegate Control with VSeWSS 1.3

In this post you can see how we can develop and deploy a custom delegate control using VSeWSS 1.3. In this sample I am going to create a delegate control which will display an image at the place of site’s logo. So, if I want to show a different site logo in one of my sub sites then I can create another feature which will show a control to load a different image at that particular site.

This requirement includes the development of following objects.

a.      A custom master page to show my custom delegate control

b.      Two custom features to show different images embedded in web user controls.

c.    Couple of web user controls and images

 

1.      Create a new VSeWSS 1.3 “Empty” project in Microsoft Visual Studio 2008. Name that application as “MyDelegateControl” (or give your own name)

           clip_image002

2.     Once you click “Ok” then you can see a new window with the following option. Here I am selecting the GAC deployment which is the default option.

          clip_image004

3.      Right click on the project and select Add à new item, and then select “SharePoint” as the category. Then you can see several templates available on right hand side and there select “Module”.

          clip_image006

4.      Rename the “Module1” as MyModule and then you can see that it will add in to the solution explorer with a sampletext.txt file. Now do the following.

 

a.      Rename the sampletext.txt file to MyMaster.master

b.      Go to the following location, C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\GLOBAL and then open the default.master page. Copy the html content and paste it in the MyMaster.master page inside MyModule folder in the solution explorer.

 

c.       Open the MyMaster.master page and search for the SharePoint SiteLogoImage control and make that control as invisible by adding the following property Visible="false".

 

<SharePoint:SiteLogoImage id="onetidHeadbnnr0" Visible="false" LogoImageUrl="/_layouts/images/titlegraphic.gif" runat="server"/>

 

Once you do that then add a custom delegate control just below of the SiteLogoImage control.

 

<SharePoint:DelegateControl runat="server" ControlId= "MyDelegateControl" > </SharePoint:DelegateControl>         

 

 

d.      Open the Module.xml file and add the following.

 

<Module Name="Module1" Url="_catalogs/masterpage">

<File Path=" MyMaster.master" Url="MyMaster.master" Type="GhostableInLibrary" /> </Module>

 

5.      Right click on the project and select Add à new item, and then select “SharePoint” as the category. Then you can see several templates available on right hand side and there select “Template”.

            clip_image008

Template : In this project we are going to deploy a custom user control to the Control Templates folder and a custom feature to the Features Folder. Thus once you select this template, you can create the folder hierarchy similar in the low location and once you deploy the package all the custom files will be deployed to the corresponding locations automatically.

 

C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE

 

6.      Once you complete the 5th step then you can see the Template Folder added to the project with a text file. The text file is just for a sample, you can remove it once you add the Template folder into the project.

 

7.      Now, do the following steps.

 

a.      Create a folder with name “IMAGES” inside the “Templates” folder and two images to this folder. (I am adding Red.gif and Green.gif images in this sample, I took those two images from the 12\Template\Images folder, images are kpipepperalarmlarge-2.gif and kpipepperalarmlarge-0.gif, you can take it to the visual studio project and rename it.)

 

b.      Create a folder with name “CONTROLTEMPLATES” inside the “Templates” folder in the Visual Studio.

c.       Give names as Red.ascx and Green.ascx for the user controls. Open both the user controls and add a <img > tag to show the Red & Green images.

 

Red.ascx

<%@ Control Language="C#"%>

<img border='0' src="/_layouts/images/Red.gif" >

 

Green.ascx               

<%@ Control Language="C#"%>

<img border='0' src="/_layouts/images/Green.gif" >

 

Now, the solution explorer view will be like below

 

clip_image010

 

8.      Our next step is to create two features for providing the controls to our custom delegate control. One feature is for providing the Green.ascx control and other feature is for providing Red.ascx control to Delegate control. We can create the feature by switching the view to WSP View; you can get this view by View à Other Windows à WSP View.

             clip_image012

9.      You can see the current WSP structure like below in the WSP view.

            clip_image014

10.  Now click on the “Create new feature” button then you can see a popup with Feature Scope Settings. Here I am selecting “Web” as my feature’s scope and adding a default element.xml file.

           clip_image016

11.  Once we get the feature in the WSP view then rename the Feature and Element folder names likes in below screen shot. (You can use function key F2 to rename the folders. You can’t rename the Element1.xml file in the WSP view, for that you have to switch to the solution explorer view and there we can see the element1.xml and rename the file as you want.)

           clip_image018

12.  If you try to add a new feature again then you may get a dialogue window says about the Feature1 already exists, ie because whenever you add the first feature with elements it is actually creating a Feature folder with name Feature1 in the solution explorer view. So, first you have to switch to the WSP view and rename the Feature1 folder. I have renamed the Feature1 folder as “RedControl” in this sample.

 

13.  Once you are done with the above step then again switch to the WSP view add your second feature and then rename the Feature1 folder to “GreenControl”. The below screenshot is the final view of WSP and Solution explorer.

 

(Also, give your own titles to the Feature1.xml files. I am giving Red Control & Green Controls respectively for both the features)

             clip_image020

14.   Now double click on the Elements1.xml file of the RedControl in either WSP or Solution explorer view and do the following changes.

                                                                                                                             

Add the below control tag to the Elements1.xml of RedControl:

<?xml version="1.0" encoding="utf-8"?>

<Elements Id="aac1a327-3a3d-4bd8-aa3b-6d8b3ba0ede2" xmlns="http://schemas.microsoft.com/sharepoint/" >

 

  <Control

    Id="MyDelegateControl"

    Sequence="100"

    ControlSrc="~/_controltemplates/Red.ascx">

  </Control> 

 

</Elements>

 

Add the below control tag to the Elements1.xml of GreenControl:

<?xml version="1.0" encoding="utf-8"?>

<Elements Id="2f573bc3-320e-4329-98f8-7f88c59f99e2" xmlns="http://schemas.microsoft.com/sharepoint/" >

 

            <Control  Id="MyDelegateControl"  Sequence="99"

    ControlSrc="~/_controltemplates/Green.ascx">

</Control>

</Elements>

 

 

15.  That’s all, we are done! Now you just right click on the project in the solution explorer and choose “Deploy Solution”.

            clip_image022

16.  After deploying the solution, browse to your SharePoint site in which you deployed the application and you can see your custom master (MyMaster.master) page in the master page gallery. (Site Actions à Site Settings à Galleries à Master Page)

 

17. Now go to the site features, and then you can see that the features are get activated.

(Site Actions à Site Settings à Site Administration à Site Features)

            clip_image024

18.   Now change the default master page to MyMaster.page in the Master page settings. (Site Actions à Site Settings à Look and Feel à Master Page). You have to enable the publishing features in order to get this option. Otherwise you can directly access the page by hitting the URL like the following: http://sitename/_layouts/ChangeSiteMasterPage.aspx.

 

19.   After that if you go to the home page and you can see that the Green Control rendered its image on top of the site. This is because, even if both the features are activated, the delegate control will render the control which has a lowest sequence number. In our case Green Control’s sequence number is 99 and the Red Control’s sequence number is 100. (see the Elements1.xml files)

            clip_image026

20.   If you want to see the delegate control in action, then go to the site feature and deactivate the Green Control feature. So, now your delegate control will render the Red Control because none of other controls are available less than its sequence number which is 100.

           clip_image028

      21. Go to the home page again to see the change.

          clip_image030 

You can apply the same functionality to your sub sites too, because the feature was installed as “Web” scope. So, if you apply the same master page to all the sub sites then you can toggle the images as per your requirement.

Posted by sowmyancs | 2 Comments

How to customize an out of the box Delegate Control with VSeWSS 1.3

In this post you can see how we can develop and deploy an application to customize SmallSearchInputBox delegate control using VSeWSS 1.3. I have referred the MSDN article - “How to customize delegate control” for developing this solution http://msdn.microsoft.com/en-us/library/ms470880.aspx. This sample will customize the out of the box search control. Here I am customizing the image on the search button and the alter texts which are coming over the image and the search text box.

A look at the out of the box search control.

                        clip_image002

A look at the search control after the customization of the delegate control.

                         clip_image004

Please go through the above MSDN article and its related links for getting better understanding about the delegate controls.

1.      Create a new VSeWSS 1.3 “Empty” project in Microsoft Visual Studio 2008. Name that application as “MyDelegateControl” (or give your own name)

           clip_image006

2.      Once you click “Ok” then you can see a new window with the following option. Here I am selecting the GAC deployment which is the default option. 

           clip_image008

3.      Right click on the project and select Add à new item, and then select “SharePoint” as the category. Then you can see several templates available on right hand side and there select “Template”.

            clip_image010

Template: In this project we are going to deploy a custom user control to the Control Templates folder and a custom feature to the Features Folder. Thus once you select this template, you can create the folder hierarchy similar in the below location and once you deploy the package then all the custom files will be deployed to the corresponding locations automatically.

 

C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE

 

4.       Once you complete the 3rd step then you can see the Template Folder added to the project with a text file. The text file is just for a sample, you can remove it once you add the Template folder into the project.

           clip_image012

5.      Now, do the following.

 

a.      Create a folder with name “CONTROLTEMPLATES” inside the “Templates” folder in the Visual Studio.

b.      Go to the following location C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\CONTROLTEMPLATES and then copy and paste the SearchArea.ascx control in Templates à ControlTemplates folder in Visual Studio.

c.       Rename the ascx control to mySearchArea.ascx

            clip_image014

6.       Open mySearchArea.ascx control and change the image name. Here I am giving the out of the box image “FOLDER.gif”.

            clip_image016

7.       Our next step is to create a feature, In VSeWSS 1.3. We can create the feature by switching the view to WSP View, you can get this view by View à Other Windows à WSP View

           clip_image018

8.      You can see the current WSP structure like below in the WSP view.

          clip_image020

9.      Now click on the “Create new feature” button then you can see a popup with Feature Scope Settings. Here I am selecting “Web” as my feature’s scope and adding a default element.xml file.

           clip_image022

10.  Once we get the feature in the WSP view then rename the Feature and Element folder names likes in below screen shot. (You can use function key F2 to rename the folders. You can’t rename the Element1.xml file in the WSP view, for that you have to switch to the solution explorer view and there we can see the element1.xml and you can rename the file as you want.)

            clip_image024

11.  Double click on the feature.xml file in the WSP view and modify the feature.xml. Here I am just changing the title of my feature to a different one.

           clip_image026

12.   Now double click on the Elements1.xml file and do the following changes.

                                                                                                                             

a.      Add the Control tag as per the MSDN article.

b.      Change the sequence number to a number less than 20

c.       Change the controlsrc pointing to our custom .ascx control

d.      Add two properties to show the tool tip on the image button and the text box

            clip_image028

13.  That’s all, we are done! Now you just right click on the project in the solution explorer and choose “Deploy Solution”.

            clip_image030

14.   After deploying the solution, browse to your SharePoint site in which you deployed the application and you can see your feature in the site features, and then activate the feature!

            clip_image032

Now, go to the home page of your SharePoint site and you can see the action of your delegate control customization.

         clip_image004[1]

Posted by sowmyancs | 1 Comments

Three cool things for SharePoint developers....

Microsoft has released 3 cool things for SharePoint develoepers recently.

1.      SPDisposeCheck v1.3.1

2.      VSeWSS 1.3 CTP

3.      MSDN Article - Best Practices: Using Disposable Windows SharePoint Services Objects

SPDisposeCheck V1.3.1

This is really a cool tool evaluates compiled custom code in .NET Assemblies that uses SharePoint and it reports violations of our guidance for disposing of memory in SharePoint. It is aimed at helping SharePoint Developers to adhere to the best practice guidance.

For more information click here

VSeWSS 1.3 CTP

Here is the latest version of VSeWSS 1.3 with really cool new features. Please visit the official SharePoint blog to get more information and try it for getting in to know about the new features and download link.

MSDN Article - Best Practices

This is really cool new article with lots of information for the developers to handle the code perfectly to enhance the performance. Please see more information here.

Also, I would recommend to visit my post here to get extra information.

Posted by sowmyancs | 1 Comments

Error: New instances of this workflow template are currently disallowed.

Sometimes we may get this error whenever we re-install the workflow after doing some changes. It may come once you un-install the workflow and install it again.

Now how to allow new instances for workflow?

To resolve this problem we need to set the workflow association to "Allow" and the new instances of the workflow should be created again. In order to set this option, what we need to do that, go to the Remove Workflows settings page by List à Settings à Workflow Settings à Remove Workflows.

And here we need to select the “Allow” option.

image

Posted by sowmyancs | 1 Comments

Customize the QuickLaunch menu and show it on top of the site as TopNavigation menu

Once I got an interesting question from our internal discussions about whether we can show the QuickLaunch menu on top of the site as how TopNavigation menu bar look like. The requirement is given below.

clip_image002

The left navigation menu (<SharePoint:AspMenu id="QuickLaunchMenu" DataSourceId="QuickLaunchSiteMap" /> ) has been implemented in the default.master (for teamsites) and you can see the control tags in the default.master page.

If we want to show the QuickLaunch menu on top of the site with menus then we can change the Orientation to Horizontal and we can put that control on top. We can use SharePoint designer to do this easily or we can take a copy of default.master page and then modify it in any text editor and upload it to your site with a custom name.

You will get the default.master page from the following location. C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\GLOBAL

Then the view would be something like this.

clip_image004

Here is the control tag for implementing the quicklaunch menu with menu driven navigation. Please do the highlighted changes.

<Sharepoint:SPNavigationManager id="QuickLaunchNavigationManager"  runat="server"

                        QuickLaunchControlId="QuickLaunchMenu"

                        ContainedControl="QuickLaunch"

                        EnableViewState="false" >

                        <div>

                              <SharePoint:DelegateControl ID="DelegateControl1" runat="server"

                                    ControlId="QuickLaunchDataSource">

                               <Template_Controls>

                                    <asp:SiteMapDataSource

                                    SiteMapProvider="SPNavigationProvider"

                                    ShowStartingNode="False"

                                    id="QuickLaunchSiteMap"

                                    StartingNodeUrl="sid:1025"

                                    runat="server"

                                    />

                               </Template_Controls>

                              </SharePoint:DelegateControl>

                              <SharePoint:AspMenu      

                              id="QuickLaunchMenu"

                              DataSourceId="QuickLaunchSiteMap"

                              runat="server"

                              Orientation="Horizontal"

                              StaticDisplayLevels="1"

                              ItemWrap="true"

                              MaximumDynamicDisplayLevels="1"

                              StaticSubMenuIndent="0"

                              SkipLinkText=""

                              >                             

                              <StaticMenuStyle/>

                        <StaticMenuItemStyle CssClass="ms-topnav" ItemSpacing="0px"/>

                        <StaticSelectedStyle CssClass="ms-topnavselected" />

                        <StaticHoverStyle CssClass="ms-topNavHover" />

                        <DynamicMenuStyle  BackColor="#F2F3F4" BorderColor="#A7B4CE" BorderWidth="1px"/>

                        <DynamicMenuItemStyle CssClass="ms-topNavFlyOuts"/>

                        <DynamicHoverStyle CssClass="ms-topNavFlyOutsHover"/>

                        <DynamicSelectedStyle CssClass="ms- topNavFlyOutsSelected"/>                                  

</SharePoint:AspMenu>

                        </div>

                        </Sharepoint:SPNavigationManager>

Posted by sowmyancs | 2 Comments

How to create a webpart with chrome type

If we want to customize the layout a webpart – say don’t want the border and title, or only need border or only need title etc, we will do it through UI by setting the Chrome type of the corresponding webpart.

Here I just want to know how we can set this one by default whenever we create custom webpart.

clip_image002

Here I just want to know how we can set this one by default whenever we creating custom webpart. We can accomplish this by setting the ChromeType property of the webpart in the CreateChildControls() method. Here is the sample code snippet.

clip_image004

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.webparts.partchrometype.aspx

 

Posted by sowmyancs | 1 Comments

How to find out the storage space allocation details a site through code.

SharePoint has a cool and great facility called Quota templates. In order to get this facility in UI, you have to do the following. Refer: http://technet.microsoft.com/en-us/library/cc263223.aspx

Enable the site collection quotas in the central administration site – under application management.

clip_image002

Once you click on the “site collection quotas and locks” you will be redirecting to another page and there you can set your quota template and lock status.

clip_image004

Once you enable this one, then you can see a new link under the site collection administration section of your site.

clip_image006

Once you click on that link it will redirect to another beautiful page which is given below.

clip_image008

In the above page we can see all document libraries, documents and lists by selecting the “show only” drop down. Also here we can filter the result using the “Show items” drop down and also we can sort the list items using “Sort By” drop down.

The list will show the name of the list or library and the corresponding size and related information. Now we can see how we can retrieve this information through code. The below code is self explanatory and I believe it won’t confuse you any more J

We can go with the code if you want to create a custom view representation of this detail. Also it will help us if you want to get this information anywhere in your custom application.

   1: SPSite oSite = new SPSite("http://blr3r7-19c:13774/sites/testwp");
   2: DataTable oDtRawData = null;
   3:             
   4: // this line of code will return the stroage information of all the document lirbaries in this site
   5: oDtRawData = oSite.StorageManagementInformation(SPSite.StorageManagementInformationType.DocumentLibrary,SPSite.StorageManagementSortOrder.Increasing, SPSite.StorageManagementSortedOn.Size,100);
   6:  
   7: // this line of code will return the stroage information of all the lists in this site
   8: oDtRawData = oSite.StorageManagementInformation(SPSite.StorageManagementInformationType.List, SPSite.StorageManagementSortOrder.Increasing, SPSite.StorageManagementSortedOn.Size, 100);
   9:  
  10: // this line of code will return the stroage information of all the Documents in this site
  11: oDtRawData = oSite.StorageManagementInformation(SPSite.StorageManagementInformationType.Document, SPSite.StorageManagementSortOrder.Increasing, SPSite.StorageManagementSortedOn.Size, 100);
  12:             
  13: // if you wan to see column names, loop through all the columns and find out the names and grab the needed one. 
  14: foreach (DataColumn oColumn in oDtRawData.Columns)
  15:    {
  16:             Console.WriteLine(oColumn.ColumnName);                
  17:    }
  18: Console.ReadLine();
  19:  
  20: // loop through all the rows and find out the values. Here the size will be return in bytes (size/1024 = size in KBs)
  21:   foreach (DataRow oRow in oDtRawData.Rows)
  22:    {
  23:          Console.WriteLine(oRow["Title"].ToString() + " : " + oRow["Size"].ToString() + " : " + oRow["LeafName"].ToString());               
  24:    }
  25:  
  26: Console.ReadLine();  
Posted by sowmyancs | 5 Comments

Work-around to render the custom field in list view

Once I got a request from one of colleagues to create custom button field which will kick off a workflow for the list item which it get associated. Then, I had created a custom field which inherited from SPFieldText and rendered an ASP.net button control and in the click event I have implemented the code to kick off the workflow.

 

Everything worked fine and field rendered perfectly in the New, Edit, and Display form. But in the list view it doesn’t shows the button, we can see the column name in the list but can’t see the button in the list item. Below is the code that I have used to create the field and the FLDTypes.xml file.

 

ButtonFieldWF.Field.cs

   1: using System;
   2: using System.Runtime.InteropServices;
   3: using System.Security.Permissions;
   4: using Microsoft.SharePoint;
   5: using Microsoft.SharePoint.WebControls;
   6: using Microsoft.SharePoint.Security;
   7:  
   8: namespace CustomButtonField
   9: {
  10:     // TODO: Replace, as needed, "SPFieldText" with some other class derived from SPField. 
  11:     // TODO: Update, as needed, ParentType element in fldtypes*.xml in this solution. 
  12:     [CLSCompliant(false)]
  13:     [Guid("4a71f8a6-a7d1-45bb-9ced-8ed1676c95d6")]
  14:     public class ButtonFieldWFField : SPFieldText
  15:     {
  16:         public ButtonFieldWFField(SPFieldCollection fields, string fieldName)
  17:             : base(fields, fieldName)
  18:         {
  19:  
  20:         }
  21:         
  22:         public ButtonFieldWFField(SPFieldCollection fields, string typeName, string displayName)
  23:             : base(fields, typeName, displayName)
  24:         {
  25:         }
  26:  
  27:         public override BaseFieldControl FieldRenderingControl
  28:         {
  29:             [SharePointPermission(SecurityAction.LinkDemand, ObjectModel = true)]
  30:             get
  31:             {
  32:                 BaseFieldControl fieldControl = new ButtonFieldWFFieldControl();
  33:                 fieldControl.FieldName = this.InternalName;
  34:  
  35:                 return fieldControl;
  36:             }
  37:         }
  38:  
  39:         
  40:     }
  41: }

ButtonFieldWF.FieldControl.cs

   1: using System;
   2: using System.Runtime.InteropServices;
   3:  
   4: using Microsoft.SharePoint;
   5: using Microsoft.SharePoint.WebControls;
   6: using Microsoft.SharePoint.Workflow;
   7:  
   8: using System.Web;
   9: using System.Web.UI;
  10: using System.Web.UI.WebControls;
  11: using System.Web.UI.HtmlControls;
  12:  
  13: namespace CustomButtonField
  14: {
  15:     // TODO: Replace, as needed, "TextField" with some other class derived from Microsoft.SharePoint.WebControls.BaseFieldControl.
  16:     [CLSCompliant(false)]
  17:     [Guid("9fbee449-9f7f-48de-999b-d7187dfe78cf")]
  18:     public class ButtonFieldWFFieldControl : TextField
  19:     {
  20:  
  21:         private Button oBtnWF = null;
  22:  
  23:         protected override void CreateChildControls()
  24:         {
  25:             base.CreateChildControls();
  26:  
  27:  
  28:             if (this.ControlMode == SPControlMode.Edit || this.ControlMode == SPControlMode.New || this.ControlMode == SPControlMode.Display)
  29:             {
  30:                 oBtnWF = new Button();
  31:                 oBtnWF.Text = "Start the custom WF";
  32:                 oBtnWF.Click += new EventHandler(oBtnWF_Click);
  33:                 base.Controls.Add(oBtnWF);
  34:  
  35:             }
  36:         }
  37:  
  38:         void oBtnWF_Click(object sender, EventArgs e)
  39:         {
  40:  
  41:             SPSite oSite = this.ListItem.Web.Site;
  42:  
  43:             //get the workflow associated with this doc lib and kick if off 
  44:             if (this.List.WorkflowAssociations.Count > 0)
  45:             {
  46:                 // kick off the first workflow..you can kick off your custom workflow by taking it properly
  47:                 SPWorkflowAssociation wrkFl = this.List.WorkflowAssociations[0];
  48:                 oSite.WorkflowManager.StartWorkflow(this.ListItem, wrkFl, wrkFl.AssociationData, true);
  49:             }
  50:             System.Web.HttpContext.Current.Response.Write("started...");
  51:  
  52:         }       
  53:  
  54:         protected override void Render(HtmlTextWriter output)
  55:         {
  56:             this.oBtnWF.RenderControl(output);
  57:         }
  58:     }
  59: }

fldtypes_ButtonFieldWF.xml

   1: <?xml version="1.0" encoding="utf-8"?>
   2: <FieldTypes>
   3:   <FieldType>
   4:     <Field Name="TypeName">ButtonFieldWFField</Field>
   5:     <Field Name="TypeDisplayName">ButtonFieldWFField</Field>
   6:     <Field Name="TypeShortDescription">ButtonFieldWFField</Field>
   7:     <Field Name="ParentType">Text</Field>
   8:     <Field Name="UserCreatable">TRUE</Field>
   9:     <Field Name="FieldTypeClass">4a71f8a6-a7d1-45bb-9ced-8ed1676c95d6</Field>
  10:   </FieldType>
  11: </FieldTypes>

After doing research on this issue confirmed that, by default we can’t render any controls like button, imagebutton, etc in list view. Because the items are rendering in the list view through CAML and  <![CDATA [ html goes here ] ], so here the only work-around is construct the control using CDATA and display it.

   1: <?xml version="1.0" encoding="utf-8"?>
   2: <FieldTypes>
   3:   <FieldType>
   4:     <Field Name="TypeName">ButtonFieldWFField</Field>
   5:     <Field Name="TypeDisplayName">ButtonFieldWFField</Field>
   6:     <Field Name="TypeShortDescription">ButtonFieldWFField</Field>
   7:     <Field Name="ParentType">Text</Field>
   8:     <Field Name="UserCreatable">TRUE</Field>
   9:     <Field Name="FieldTypeClass">4a71f8a6-a7d1-45bb-9ced-8ed1676c95d6</Field>
  10:         <RenderPattern Name="DisplayPattern">
  11:               <Switch>
  12:                     <Expr>
  13:                           <Column Name="ContentTypeId" />
  14:                     </Expr>
  15:                     <!-- This is the Content Type Id for FOLDERs -->
  16:                     <Case Value="0x012000499529A73A47A1408DC7541F73C144CE">
  17:                           <!-- We do not want to display anything for folders -->
  18:                     </Case>
  19:                     <Default>
  20:                                                   
  21:                           <!-- This is the List ID -->
  22:                           <!-- ListProperty Select="Name" / -->
  23:                          
  24:                           <HTML>
  25:                                 <![CDATA[<input type="button" onClick="Test();" value="Start the custom WF" id="btn_]]>
  26:                           </HTML>
  27:                           <Column Name="ID" />
  28:                           <HTML>
  29:                                 <![CDATA[" />]]>
  30:                           </HTML>
  31:                           
  32:                           <HTML>
  33:                                 <![CDATA[
  34:                               <script type="text/javascript" language="javascript"> 
  35:                                     
  36:                                function Test()
  37:                                {
  38:                                     alert('hiii');                                  
  39:                                }
  40:                                </script>
  41:                                
  42:                                ]]>
  43:                           </HTML>
  44:                           
  45:                     </Default>
  46:               </Switch>
  47:         </RenderPattern>
  48:   </FieldType>
  49: </FieldTypes>

clip_image002

But, here another obstacle was the execution of server side code to kick off the workflow. We can’t write the server side code in <! [CDATA [] ]>, so we can kick off the workflow by putting that code in the page load of an aspx page and open it while clicking the button.

(eg : window.open(“_layouts/custompage.aspx”)).

 

Another work-around would be adding an ECB menu item for the list item and implement this functionality while clicking on it.  

Also please check this How-To video to know how we can create custom fields in WSS 3.0, if you are not familliar with this already. 

Posted by sowmyancs | 28 Comments

Integration of Oracle Access Manager with SharePoint webapplications

Recently I had worked with an interesting case in which customer was using Oracle Access Manager  (OAM) for providing the security in their application. They were using a Java application in which they were used LDAP membership provider. There was a SharePoint webapplication which was configured to use FBA and use the same LDAP membership provider.

 

Actual requirement was, whenever an user access the SharePoint URL, the OAM’s webgate (it is an IIS plug-in [will register it as ISAPI filter in the virual directory of SharePoint webapplication] developed by Oracle responsible for checking access policy and authentication etc ) will intercept the URL and display a generic login page to the user. User put his credentials and OAM’s webgate then validates it and allow the user to access SharePoint URL.

 

At this point, SharePoint does not know who the user is even if OAM has already authenticated him. Note that SharePoint already has LDAPMembership to the same LDAP that used by OAM. So what will happen is, since the SharePoint site is configured to use FBA it will directly show the SharePoint FBA login.aspx to enter the credentials. But they don’t want to show that page again because user has been already authenticated by the OAM.

 

The only work-around is place a hook point and does the redirection. Here we will get the help of a HttpModule. There is a good post for getting the high level picture of this kind of facility here : siteminder and ASP.NET. I have taken the below picture from the that post for giving a graphical idea about how this type of authentication works.

 

                         image

Here consider the ASP.NET site as a SharePoint site. For OAM scenario also the only work-around is use  HTTPModule but since the SharePoint site is using FBA authentication we have do some modification in the HTTPModule which  I am giving below.

HttpModule code

   1: using System;
   2: using System.Security;
   3: using System.Security.Principal;
   4: using System.Web;
   5: using System.Web.Security; 
   6:  
   7: namespace MyOAMHttpModule
   8: {
   9:    class OAMHttpModule : IHttpModule
  10:    {
  11:         public void Init(HttpApplication app)
  12:         {
  13:             app.AuthenticateRequest += (new EventHandler(this.Application_AuthenticateRequest));
  14:             app.PreSendRequestHeaders += (new EventHandler(this.Application_PreSendRequestHeaders));
  15:         } 
  16:  
  17:         private void Application_AuthenticateRequest(object sender, EventArgs e)
  18:         {
  19:             HttpApplication app = (HttpApplication)sender;
  20:             if (app.User == null)
  21:             {
  22:                 string[] roles = new string[1];
  23:                 roles[0] = "GuestUser";
  24:                 GenericIdentity id = new GenericIdentity("testuser1","Forms");
  25:                 GenericPrincipal p = new GenericPrincipal(id, roles);
  26:                 app.Context.User = p;
  27:             }
  28:         }
  29:  
  30:         private void Application_PreSendRequestHeaders(object sender, EventArgs e)
  31:         {
  32:             HttpApplication app = (HttpApplication)sender;
  33:             if (app.Response.RedirectLocation != null)
  34:             {
  35:                 if (app.Response.RedirectLocation.Contains("AccessDenied.aspx?Source") && app.User.Identity.Name == "testuser1")
  36:                 {
  37:                     app.Response.Redirect("/_layouts/login.aspx?ReturnUrl=" + app.Request.RawUrl);
  38:                 }
  39:             }
  40:  
  41:         } 
  42:  
  43:         public void Dispose()
  44:         {
  45:  
  46:         }
  47:  
  48: }

NB: If you are using "single sign on"  in which if you are accessing the sharepoint site through a different site in which you have already authenticated , then in that scenario you to install this assembly of the HttpModule in GAC which will provide the shared access within the webserver. Otherwise, you may get an "server Error '/samplesite' Application" error while accessing the SharePoint site, here the "samplesite" is the name of the virutal directory of the other site from which where you are coming to sharepoint site. Because if you keep the dll of that HTTPmodule in the local /bin directory of the SharePoint application and if you use FBA authentication in OAM (OAM also has FBA authentication mechanism), in that it may not allow you to load that dll from SharePoint webapplication's local bin directory.

Flow of user access :

  1. User types the URL for a SharePoint application into the web browser.
  2. OAM’s webgate (IIS plug-in/ web-agent developed by Oracle responsible for checking Access policy and authentication etc) intercepts the URL and display our generic login page to user. User put his credentials. OAM webgate then validate it and allow the user to access SharePoint URL.
  3. At this point SharePoint does not know who the user is even if OAM has already authenticated him. Note that our SharePoint already has LDAPmembership to the same LDAP that used by OAM.
  4. Now the HTTPModule  will come to our rescue which will,

a.   Rread the USER_ID from header (set by OAM after the authentication) and create a GenericPrincipal for SharePoint. 

       b.   Set the SSO token in the browser so user can have single sign on with other applications.

 

The outcome out of this model is,

 

a.       Share point will not display its login page to the user.

b.      The user -to-role assignment can still be possible inside SharePoint as SharePoint is also connected to the same LDAP that is used by OAM for authentication (which is also the user db for OAM) through LDAP-membership.

Posted by sowmyancs | 1 Comments
More Posts Next page »
 
Page view tracker