<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>SharePoint Config</title>
	
	<link>http://www.sharepointconfig.com</link>
	<description>Ari Bakker's thoughts on customising and configuring SharePoint 2007 and 2010</description>
	<lastBuildDate>Thu, 12 Aug 2010 20:15:09 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/AriBakker" /><feedburner:info uri="aribakker" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Creating custom parameters for a SPDataSource</title>
		<link>http://feedproxy.google.com/~r/AriBakker/~3/RfNbuB5Czyw/</link>
		<comments>http://www.sharepointconfig.com/2010/08/creating-custom-parameters-for-a-spdatasource/#comments</comments>
		<pubDate>Thu, 12 Aug 2010 19:55:23 +0000</pubDate>
		<dc:creator>Ari Bakker</dc:creator>
				<category><![CDATA[Data View]]></category>
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://www.sharepointconfig.com/?p=769</guid>
		<description><![CDATA[The SPDataSource is a great control for retrieving data in SharePoint. You can query a single list, multiple lists/libraries or webs and bind the data to any ASP.NET data bound control such as a Repeater, ListView, GridView or DropDownList as well as the DataFormWebPart if you want to control the output using XSLT. You can [...]]]></description>
			<content:encoded><![CDATA[<p>The <a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.webcontrols.spdatasource.aspx">SPDataSource</a> is a great control for retrieving data in SharePoint. You can query a single list, multiple lists/libraries or webs and bind the data to any ASP.NET data bound control such as a Repeater, ListView, GridView or DropDownList as well as the DataFormWebPart if you want to control the output using XSLT.</p>
<p>You can also pass in parameters for your query such as the ListName or WebUrl using the parameter classes provided by ASP.NET such as the QueryStringParameter and ControlParameter class. As these are all generic ASP.NET controls, however, there is no way of using SharePoint specific information such as properties of the current page, or information from User Profiles. For example it isn’t possible to use this on a SharePoint publishing page and use a metadata value such as the Title, Author or list item ID to filter the results.</p>
<p>Some examples of where this might be useful are:</p>
<ul>
<li>Displaying items from a list that has a lookup column pointing to the pages library (e.g. a comments list that contains a lookup to a publishing page)</li>
<li>Displaying items that are related to properties on the current page (e.g. ‘recent articles by this author’ or ‘other articles in this category’)</li>
<li>Displaying items using a configurable property stored in SharePoint (e.g. displaying items from a specific list or site that can be altered by an end user)</li>
<li>Displaying a set of items based on information from the current users SharePoint profile (e.g. pages that relate to the current user&#8217;s office)</li>
</ul>
<p>One easy way of creating these dynamic parameters is to create a custom class that inherits from System.Web.Controls.Parameter. We can then use the Evaluate method to retrieve the information we want. The example below shows how this can be done to retrieve a value from the current page/list item.</p>
<div id="codeSnippetWrapper" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; width: 97.5%; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; cursor: text; border: silver 1px solid; padding: 4px;">
<div id="codeSnippet" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span> PageFieldParameter : System.Web.UI.WebControls.Parameter</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">{</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span> PropertyName { get; set; }</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #0000ff;">protected</span> <span style="color: #0000ff;">override</span> <span style="color: #0000ff;">object</span> Evaluate(HttpContext context, System.Web.UI.Control control)</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    {</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        <span style="color: #0000ff;">if</span> (SPContext.Current != <span style="color: #0000ff;">null</span> &amp;&amp; SPContext.Current.ListItem != <span style="color: #0000ff;">null</span> &amp;&amp; !<span style="color: #0000ff;">string</span>.IsNullOrEmpty(PropertyName))</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        {</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">            <span style="color: #0000ff;">switch</span>(PropertyName)</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">            {</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">                <span style="color: #0000ff;">case</span> <span style="color: #006080;">"ID"</span> :</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">                    <span style="color: #0000ff;">return</span> SPContext.Current.ListItem.ID;</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">                <span style="color: #0000ff;">case</span> <span style="color: #006080;">"DisplayName"</span> :</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">                    <span style="color: #0000ff;">return</span> SPContext.Current.ListItem.DisplayName;</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">                <span style="color: #0000ff;">default</span> :</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">                    <span style="color: #0000ff;">return</span> SPContext.Current.ListItem[PropertyName];</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">            }</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        }</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">null</span>;</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    }</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">}</pre>
</div>
</div>
<p>We can then use this in our SPDataSource to bind to parameters such as the WebURL, ListItemID, or pass these into our CAML query. The example below shows how we could use this on a publishing page to display items from a ‘Comments’ list that contains a lookup field pointing to the pages within this site.</p>
<div id="codeSnippetWrapper" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; width: 97.5%; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; cursor: text; border: silver 1px solid; padding: 4px;">
<div id="codeSnippet" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span style="background-color: #ffff00;">&lt;%@ Register Tagprefix="CustomWebControls" Namespace="Ari.PublicWebsite.ServerControls" Assembly="Ari.PublicWebsite"  %&gt;</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">SharePointWebControls:SPDataSource</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #ff0000;">runat</span><span style="color: #0000ff;">="server"</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #ff0000;">ID</span><span style="color: #0000ff;">="dsComments"</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #ff0000;">DataSourceMode</span><span style="color: #0000ff;">="List"</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #ff0000;">UseInternalName</span><span style="color: #0000ff;">="true"</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #ff0000;">UseServerDataFormat</span><span style="color: #0000ff;">="true"</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #ff0000;">selectcommand</span>="&amp;<span style="color: #ff0000;">lt</span>;<span style="color: #ff0000;">View</span><span style="color: #0000ff;">&gt;&lt;</span><span style="color: #800000;">Query</span><span style="color: #0000ff;">&gt;&lt;</span><span style="color: #800000;">Where</span><span style="color: #0000ff;">&gt;&lt;</span><span style="color: #800000;">Eq</span><span style="color: #0000ff;">&gt;&lt;</span><span style="color: #800000;">FieldRef</span> <span style="color: #ff0000;">Name</span><span style="color: #0000ff;">='Post'</span> <span style="color: #ff0000;">LookupId</span><span style="color: #0000ff;">='TRUE'</span> <span style="color: #0000ff;">/&gt;&lt;</span><span style="color: #800000;">Value</span> <span style="color: #ff0000;">Type</span><span style="color: #0000ff;">='Lookup'</span><span style="color: #0000ff;">&gt;</span>{PostID}<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">Value</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">Eq</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">Where</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">Query</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">View</span><span style="color: #0000ff;">&gt;</span>"<span style="color: #0000ff;">&gt;</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">SelectParameters</span><span style="color: #0000ff;">&gt;</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">asp:Parameter</span> <span style="color: #ff0000;">Name</span><span style="color: #0000ff;">="ListName"</span> <span style="color: #ff0000;">DefaultValue</span><span style="color: #0000ff;">="Comments"</span><span style="color: #0000ff;">/&gt;</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">asp:Parameter</span> <span style="color: #ff0000;">Name</span><span style="color: #0000ff;">="WebURL"</span> <span style="color: #ff0000;">DefaultValue</span><span style="color: #0000ff;">="{sitecollectionroot}"</span><span style="color: #0000ff;">/&gt;</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">CustomWebControls:PageFieldParameter</span> <span style="color: #ff0000;">Name</span><span style="color: #0000ff;">="PostID"</span> <span style="color: #ff0000;">PropertyName</span><span style="color: #0000ff;">="ID"</span><span style="color: #0000ff;">/&gt;</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">SelectParameters</span><span style="color: #0000ff;">&gt;</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">SharePointWebControls:SPDataSource</span><span style="color: #0000ff;">&gt;</span></pre>
</div>
</div>
<p>Note the addition of a reference to our class at the top of the page and then the parameter inside the SelectParameters element of the SPDataSource. We could easily extend this to create additional properties other than the ‘PropertyName’ that is shown. If we then bind this to a Repeater we get something like the following assuming a list name ‘Comments’ exists with a lookup that references the current page.</p>
<div id="codeSnippetWrapper" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; width: 97.5%; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; cursor: text; border: silver 1px solid; padding: 4px;">
<div id="codeSnippet" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">&lt;asp:Repeater runat=<span style="color: #006080;">"server"</span> DataSourceID=<span style="color: #006080;">"dsComments"</span>&gt;</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    &lt;ItemTemplate&gt;</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        &lt;h4&gt;&lt;%# Eval(<span style="color: #006080;">"FullName"</span>) %&gt;&lt;/h4&gt;</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        &lt;span <span style="color: #0000ff;">class</span>=<span style="color: #006080;">"comment"</span>&gt;&lt;%# Eval(<span style="color: #006080;">"Body"</span>) %&gt;&lt;/span&gt;</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    &lt;/ItemTemplate&gt;</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">&lt;/asp:Repeater&gt;</pre>
</div>
</div>
<p>If we place this on the default ‘Image on left’ page layout we get something like the example shown below:</p>
<p><a href="http://www.sharepointconfig.com/wp-content/uploads/2010/08/sharepoint2010blogcommentspage.png"><img style="display: inline; border-width: 0px;" title="sharepoint-2010-blog-comments-page" src="http://www.sharepointconfig.com/wp-content/uploads/2010/08/sharepoint2010blogcommentspage_thumb.png" border="0" alt="sharepoint-2010-blog-comments-page" width="675" height="471" /></a></p>
<p>Note that in SharePoint 2010 the Content Query Web Part <strong>PageFieldValue</strong> property could be used to achieve a similar result in this specific scenario but the SPDataSource allows you to bind to controls such as the ASP.NET <a href="http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.listview.aspx">ListView</a> or the Data View Web Part and this can also be used in SharePoint 2007. Additionally the Content Query Web Part only provides dynamic parameters based on the query string or the page so information from places such as user profiles would need to use this approach.</p>
<p>If you haven’t used this control before check out the <a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.webcontrols.spdatasource.aspx">SPDataSource documentation on MSDN</a>. Chris O’Brian also has a good series titled <a href="http://www.sharepointnutsandbolts.com/2008/07/spdatasource-every-developer-friend.html">SPDataSource every developers friend</a>.</p>
    <div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/AriBakker?a=RfNbuB5Czyw:KR8HdJW1kh4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/AriBakker?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AriBakker?a=RfNbuB5Czyw:KR8HdJW1kh4:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/AriBakker?i=RfNbuB5Czyw:KR8HdJW1kh4:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AriBakker?a=RfNbuB5Czyw:KR8HdJW1kh4:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/AriBakker?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AriBakker?a=RfNbuB5Czyw:KR8HdJW1kh4:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/AriBakker?i=RfNbuB5Czyw:KR8HdJW1kh4:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AriBakker?a=RfNbuB5Czyw:KR8HdJW1kh4:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/AriBakker?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/AriBakker/~4/RfNbuB5Czyw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sharepointconfig.com/2010/08/creating-custom-parameters-for-a-spdatasource/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.sharepointconfig.com/2010/08/creating-custom-parameters-for-a-spdatasource/</feedburner:origLink></item>
		<item>
		<title>Study resources for SharePoint 2010 exams</title>
		<link>http://feedproxy.google.com/~r/AriBakker/~3/3PpovgAxdOQ/</link>
		<comments>http://www.sharepointconfig.com/2010/07/study-resources-for-sharepoint-2010-exams/#comments</comments>
		<pubDate>Thu, 15 Jul 2010 17:33:08 +0000</pubDate>
		<dc:creator>Ari Bakker</dc:creator>
				<category><![CDATA[2010]]></category>
		<category><![CDATA[Resources]]></category>
		<category><![CDATA[exams]]></category>

		<guid isPermaLink="false">http://www.sharepointconfig.com/?p=761</guid>
		<description><![CDATA[Last month I took all four of the beta SharePoint 2010 exams and I’m pleased to announce I received notification this week that I passed the lot. With the new certifications this means as well as gathering two more Technology Specialist certifications I’m a Microsoft Certified Professional Developer in SharePoint 2010 as well as a Microsoft Certified IT Professional in SharePoint 2010.
<div>
<div style="float: left;"><a href="http://www.sharepointconfig.com/wp-content/uploads/2010/07/MCITP.png"><img style="display: inline; border-width: 0px;" title="MCITP" src="http://www.sharepointconfig.com/wp-content/uploads/2010/07/MCITP_thumb.png" border="0" alt="MCITP" width="296" height="60" /></a></div>
<div style="float: right;"><a href="http://www.sharepointconfig.com/wp-content/uploads/2010/07/MCPD.png"><img style="display: inline; margin-left: 0px; margin-right: 0px; border-width: 0px;" title="MCPD" src="http://www.sharepointconfig.com/wp-content/uploads/2010/07/MCPD_thumb.png" border="0" alt="MCPD" width="290" height="80" /></a></div>
</div>
<a href="http://www.sharepointconfig.com/wp-content/uploads/2010/07/MCTS.png"><img style="display: inline; border-width: 0px;" title="MCTS" src="http://www.sharepointconfig.com/wp-content/uploads/2010/07/MCTS_thumb.png" border="0" alt="MCTS" width="505" height="80" /></a>

The format has changed since 2007 where the exams were split by SKU/license type and now have a more Developer vs. IT Pro split, and within that a Technology Specialist (TS) and PRO exam. So there are no specific SharePoint Foundation exams – they all cover the full feature set but the PRO exams are targeted at a higher level than the TS e.g. PRO is aimed at dev team leads/senior administrators. The exams have now been fully released and are available for booking via Prometric but there still isn’t a huge amount of material out there so here are some pointers to get you started (with some tips from the Microsoft Learning exam webcasts).]]></description>
			<content:encoded><![CDATA[<p>Last month I took all the beta SharePoint 2010 exams and I’m pleased to announce I received notification this week that I passed all four. With the new certifications this means as well as gathering two more Technology Specialist certifications I’m a Microsoft Certified Professional Developer in SharePoint 2010 as well as a Microsoft Certified IT Professional in SharePoint 2010.</p>
<div>
<div style="float: left;"><a href="http://www.sharepointconfig.com/wp-content/uploads/2010/07/MCITP.png"><img style="display: inline; border-width: 0px;" title="MCITP" src="http://www.sharepointconfig.com/wp-content/uploads/2010/07/MCITP_thumb.png" border="0" alt="MCITP" width="296" height="60" /></a></div>
<div style="float: right;"><a href="http://www.sharepointconfig.com/wp-content/uploads/2010/07/MCPD.png"><img style="display: inline; margin-left: 0px; margin-right: 0px; border-width: 0px;" title="MCPD" src="http://www.sharepointconfig.com/wp-content/uploads/2010/07/MCPD_thumb.png" border="0" alt="MCPD" width="290" height="80" /></a></div>
</div>
<p><a href="http://www.sharepointconfig.com/wp-content/uploads/2010/07/MCTS.png"><img style="display: inline; border-width: 0px;" title="MCTS" src="http://www.sharepointconfig.com/wp-content/uploads/2010/07/MCTS_thumb.png" border="0" alt="MCTS" width="505" height="80" /></a></p>
<p>The format has changed since 2007 where the exams were split by SKU/license type and now have a more Developer vs. IT Pro split, and within that a Technology Specialist (TS) and PRO exam. So there are no specific SharePoint Foundation exams &#8211; they all cover the full feature set but the PRO exams are targeted at a higher level than the TS e.g. PRO is aimed at dev team leads/senior administrators. The <a href="http://borntolearn.mslearn.net/btl/b/weblog/archive/2010/07/12/microsoft-sharepoint-2010-exams-are-here.aspx">exams have now been fully released</a> and are available for booking via <a href="http://www.prometric.com/Microsoft/default.htm">Prometric</a> but there still isn’t a huge amount of material out there so here are some pointers to get you started (with some tips from the Microsoft Learning exam webcasts).</p>
<h3><a href="http://www.microsoft.com/learning/en/us/Exam.aspx?ID=70-573">70-573</a> &#8211; TS: Microsoft SharePoint 2010, Application Development</h3>
<p>This covers the fundamentals of SharePoint development. Make sure you know your object model, web parts, RESTFUL URL’s, and can develop and deploy the artefacts such as site definitions, custom actions etc listed in the <a href="http://www.microsoft.com/learning/en/us/Exam.aspx?ID=70-573#tab2">technical tasks</a>.</p>
<p>With this exam it is worth brushing up on the specific object model entities/schema references for each of the skills listed. Some useful resources for these skills are:</p>
<ul>
<li><a href="http://msdn.microsoft.com/en-us/sharepoint/ee514561.aspx">What’s new for developers | SharePoint 2010</a></li>
<li><a href="http://msdn.microsoft.com/en-us/sharepoint/ee513147.aspx">Getting started with SharePoint 2010 for Professional Developers</a></li>
<li><a href="http://channel9.msdn.com/learn/courses/SharePoint2010Developer/">SharePoint 2010 Developer Training Course</a></li>
<li><a href="http://msdn.microsoft.com/en-us/cc707678.aspx">Developer hosted virtual hands-on labs</a> or download the <a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=c010fc68-b47f-4db6-b8a8-ad4ba33a35c5&amp;displaylang=en">SharePoint 2010: Getting Started with Development on SharePoint 2010 Hands-on Labs in C# and Visual Basic</a></li>
<li><a href="http://msdn.microsoft.com/en-us/library/ee231517.aspx">MSDN</a> – much better than when SharePoint 2007 was released, here are some examples of articles that match the skills listed:
<ul>
<li><a href="http://msdn.microsoft.com/en-us/library/ee539395(v=office.14).aspx">Customizing the Server Ribbon</a></li>
<li><a href="http://msdn.microsoft.com/en-us/library/ms469765.aspx">Walkthrough: Creating Connectable Web Parts in SharePoint Foundation</a></li>
<li><a href="http://msdn.microsoft.com/en-us/library/ff521587.aspx">SharePoint Foundation REST Interface</a> (and <a href="http://www.odata.org/developers/protocols/uri-conventions">OData: URI Conventions</a>)</li>
<li><a href="http://msdn.microsoft.com/en-us/library/ms544366(v=office.14).aspx">How to: Retrieve User Profile Properties</a></li>
<li><a href="http://msdn.microsoft.com/en-us/library/ee231562.aspx">Sandboxed Solution Considerations</a></li>
</ul>
</li>
</ul>
<h3><a href="http://www.microsoft.com/learning/en/us/Exam.aspx?ID=70-576">70-576</a> &#8211; PRO: Designing and Developing Microsoft SharePoint 2010 Applications</h3>
<p>This exam is targeted at lead developers and/or solution architects who are designing SharePoint applications. As per the <a href="http://www.microsoft.com/learning/en/us/Exam.aspx?ID=70-576#tab1">audience profile</a>:</p>
<blockquote><p>The candidate is responsible for designing custom code for projects that are deployed to SharePoint servers. This includes technology selection across the many ways to build code in SharePoint, ensuring the team development environment is configured, creating a strategy for code deployment, versioning, configuration, or structure.</p></blockquote>
<p>As with all the exams experience goes a long way, especially with the PRO exams as they cover designing solutions as well as developing them. MSDN can also be used for this exam as per the above, if you have access to SharePoint conference videos it would be worth looking at the development oriented ones. Books such as <a href="http://www.amazon.com/gp/product/0470529423/ref=s9_simh_gw_p14_i4?pf_rd_m=ATVPDKIKX0DER&amp;pf_rd_s=center-2&amp;pf_rd_r=1Z302W1QHH32RYRZSJ6Z&amp;pf_rd_t=101&amp;pf_rd_p=470938631&amp;pf_rd_i=507846">Professional SharePoint 2010 Development</a> are also worth a read to get a good overview of the new features.</p>
<h3><a href="http://www.microsoft.com/learning/en/us/Exam.aspx?ID=70-667">70-667</a> &#8211; TS: Microsoft SharePoint 2010, Configuring</h3>
<p>This exam is focused on configuring SharePoint 2010 through the user interface (or PowerShell when UI settings are not available). I found this exam the easiest by far and think most development leads and/or SharePoint consultants would breeze through this as well as the target audience of SharePoint administrators.</p>
<p><a href="http://technet.microsoft.com/en-us/library/ee428287.aspx">TechNet</a> is a good resource for these concepts – for example <a href="http://technet.microsoft.com/en-us/library/cc287737.aspx">installing and configuring</a>, <a href="http://technet.microsoft.com/en-us/library/ee792877.aspx">managing search</a>, <a href="http://technet.microsoft.com/en-us/library/cc794342.aspx">server and farm administration</a>, <a href="http://technet.microsoft.com/en-us/library/ee681487.aspx">service applications</a>, <a href="http://technet.microsoft.com/en-us/library/ee428315.aspx">backup</a> etc as per the <a href="http://www.microsoft.com/learning/en/us/Exam.aspx?ID=70-667#tab2">skills measured</a>. Another helpful resource is the <a href="http://technet.microsoft.com/en-us/sharepoint/ee518660.aspx">Getting Started with SharePoint Server 2010 for IT Pros</a> video series overview of new and improved features.</p>
<h3><a href="http://www.microsoft.com/learning/en/us/Exam.aspx?ID=70-668">70-668</a> &#8211; PRO: SharePoint Server 2010, Administrator</h3>
<p>The PRO administrator exam is all about topologies. Again SharePoint development leads/solution architects should have a good chance at passing this as well as infrastructure architects. A high level of what is covered is included in the audience profile:</p>
<blockquote><p>Candidates for this exam design and deploy Microsoft SharePoint Server 2010 infrastructures. These candidates might be senior administrators who act as the technical lead over a team of administrators. These candidates are responsible for the planning and deployment of SharePoint 2010 environments.  Candidates should have a minimum of two years of experience administering, deploying, managing, monitoring, upgrading, migrating, and designing SharePoint servers.</p>
<p>The candidate typically plans, designs, and maintains:</p>
<ul>
<li>Physical topologies and services architecture</li>
<li>Disaster recovery (backup, restore) and availability</li>
<li>Infrastructure capacity (users, topology)</li>
<li>Farm performance and availability</li>
<li>Migration and upgrade</li>
<li>Security and compliance requirements</li>
<li>Information architecture (interprets taxonomy)</li>
<li>Information search strategy integration with other data sources (LOB, third-party products)</li>
<li>Client application services deployment</li>
</ul>
<p>This audience also has a thorough understanding of the following:</p>
<ul>
<li>Windows PowerShell scripting</li>
<li>Server availability and performance concepts (SQL mirroring, load balancing)</li>
<li>Security concepts and authentication methods</li>
<li>Windows Server 2008 and Active Directory administration</li>
<li>Networking infrastructure services including DNS and IIS</li>
</ul>
</blockquote>
<p>Again TechNet is a useful study resource, make sure you know things like the hardware requirements for SharePoint 2010, topology options such as how to create a highly available deployment, search topologies etc as per the <a href="http://www.microsoft.com/learning/en/us/Exam.aspx?ID=70-668#tab2">skills measured</a>. There are also <a href="http://technet.microsoft.com/en-gb/sharepoint/ff420396.aspx">advanced IT Pro Training resources</a> on the official SharePoint site.</p>
<p>Hopefully these resources prove useful to people wanting to take these exams in the near future. It appears there are plenty of exam focused training resources coming soon so keep an eye on places like the <a href="http://www.microsoft.com/learning/en/us/training/sharepoint.aspx#2010">Microsoft SharePoint – Training Portal</a> as well as the <a href="http://www.amazon.com/s/ref=nb_sb_ss_c_1_15?url=search-alias%3Dstripbooks&amp;field-keywords=sharepoint+2010&amp;x=0&amp;y=0&amp;sprefix=sharepoint+2010">SharePoint 2010 books on places like Amazon</a>.</p>
    <div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/AriBakker?a=3PpovgAxdOQ:ijqmvZYUgdk:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/AriBakker?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AriBakker?a=3PpovgAxdOQ:ijqmvZYUgdk:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/AriBakker?i=3PpovgAxdOQ:ijqmvZYUgdk:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AriBakker?a=3PpovgAxdOQ:ijqmvZYUgdk:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/AriBakker?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AriBakker?a=3PpovgAxdOQ:ijqmvZYUgdk:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/AriBakker?i=3PpovgAxdOQ:ijqmvZYUgdk:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AriBakker?a=3PpovgAxdOQ:ijqmvZYUgdk:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/AriBakker?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/AriBakker/~4/3PpovgAxdOQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sharepointconfig.com/2010/07/study-resources-for-sharepoint-2010-exams/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.sharepointconfig.com/2010/07/study-resources-for-sharepoint-2010-exams/</feedburner:origLink></item>
		<item>
		<title>SharePoint 2010 Web Parts by License Type</title>
		<link>http://feedproxy.google.com/~r/AriBakker/~3/QTIfTGvzHUk/</link>
		<comments>http://www.sharepointconfig.com/2010/06/sharepoint-2010-web-parts-by-license-type/#comments</comments>
		<pubDate>Tue, 29 Jun 2010 18:41:22 +0000</pubDate>
		<dc:creator>Ari Bakker</dc:creator>
				<category><![CDATA[2010]]></category>
		<category><![CDATA[Configuration]]></category>
		<category><![CDATA[Features]]></category>
		<category><![CDATA[Planning]]></category>
		<category><![CDATA[end user]]></category>
		<category><![CDATA[web parts]]></category>

		<guid isPermaLink="false">http://www.sharepointconfig.com/?p=743</guid>
		<description><![CDATA[The official SharePoint site contains a comparison of the features in each SharePoint 2010 edition but does not include specific details on what web parts are available for each SKU/license type. This is useful to know when choosing between Foundation vs Standard vs Enterprise, as this additional functionality may be a good reason to upgrade (or turn on these features for specific users). It is also useful to know these as a developer or solution architect so you don’t custom develop something that has already been built and tested by Microsoft – something that I often see happen. 
 
<img class="excerpt" src="http://www.sharepointconfig.com/wp-content/uploads/2010/06/sharepoint-2010-insert-web-part.png" alt="sharepoint 2010 add web part"/>]]></description>
			<content:encoded><![CDATA[<p>The official SharePoint site contains a comparison of the features in each SharePoint 2010 edition but does not include specific details on what web parts are available for each SKU/license type. This is useful to know when choosing between Foundation vs Standard vs Enterprise, as this additional functionality may be a good reason to upgrade (or turn on these features for specific users). It is also useful to know these as a developer or solution architect so you don’t custom develop something that has already been built and tested by Microsoft – something that I often see happen.</p>
<p>Below are a list of the web parts that are available when creating a team site in the various editions:</p>
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<th>Web Parts by Category</th>
<th>SharePoint Foundation</th>
<th>SharePoint Server 2010 Standard</th>
<th>SharePoint Server 2010 Enterprise</th>
<th>Description</th>
</tr>
<tr class="dark">
<td><strong>Business Data</strong></td>
<td class="center"></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td><strong>Business Data Actions</strong></td>
<td class="center"></td>
<td></td>
<td class="center">x</td>
<td>Displays a list of actions from Business Data Connectivity.</td>
</tr>
<tr class="light">
<td><strong>Business Data Connectivity Filter</strong></td>
<td class="center"></td>
<td></td>
<td class="center">x</td>
<td>Filters the contents of Web Parts using a list of values from the Business Data Connectivity.</td>
</tr>
<tr>
<td><strong>Business Data Item</strong></td>
<td class="center"></td>
<td></td>
<td class="center">x</td>
<td>Displays one item from a data source in Business Data Connectivity.</td>
</tr>
<tr class="light">
<td><strong>Business Data Item Builder</strong></td>
<td class="center"></td>
<td></td>
<td class="center">x</td>
<td>Creates a Business Data item from parameters in the query string and provides it to other Web Parts.</td>
</tr>
<tr>
<td><strong>Business Data List</strong></td>
<td class="center"></td>
<td></td>
<td class="center">x</td>
<td>Displays a list of items from a data source in Business Data Connectivity.</td>
</tr>
<tr class="light">
<td><strong>Business Data Related List</strong></td>
<td class="center"></td>
<td></td>
<td class="center">x</td>
<td>Displays a list of items related to one or more parent items from a data source in Business Data Connectivity.</td>
</tr>
<tr>
<td><strong>Chart Web part</strong></td>
<td class="center"></td>
<td></td>
<td class="center">x</td>
<td>Helps you to visualize your data on SharePoint sites and portals.</td>
</tr>
<tr class="light">
<td><strong>Excel Web Access</strong></td>
<td class="center"></td>
<td></td>
<td class="center">x</td>
<td>Use the Excel Web Access Web Part to interact with an Excel workbook as a Web page.</td>
</tr>
<tr>
<td><strong>Indicator Details</strong></td>
<td class="center"></td>
<td></td>
<td class="center">x</td>
<td>Displays the details of a single Status Indicator. Status Indicators display an important measure for an organization and may be obtained from other data sources including SharePoint lists, Excel workbooks, and SQL Server 2005 Analysis Services KPIs.</td>
</tr>
<tr class="light">
<td><strong>Status List</strong></td>
<td class="center"></td>
<td></td>
<td class="center">x</td>
<td>Shows a list of Status Indicators. Status Indicators display important measures for your organization, and show how your organization is performing with respect to your goals.</td>
</tr>
<tr>
<td><strong>Visio Web Access</strong></td>
<td class="center"></td>
<td></td>
<td class="center">x</td>
<td>Enables viewing and refreshing of published Visio diagrams.</td>
</tr>
<tr class="dark">
<td><strong>Content Rollup</strong></td>
<td class="center"></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td><strong>Categories</strong></td>
<td class="center"></td>
<td class="center">x</td>
<td class="center">x</td>
<td>Displays categories from the Site Directory</td>
</tr>
<tr class="light">
<td><strong>Relevant Documents</strong></td>
<td class="center">x</td>
<td class="center">x</td>
<td class="center">x</td>
<td>Displays documents that are relevant to the current user</td>
</tr>
<tr>
<td><strong>RSS Viewer</strong></td>
<td class="center"></td>
<td class="center">x</td>
<td class="center">x</td>
<td>Displays an RSS feed.</td>
</tr>
<tr class="light">
<td><strong>Site Aggregator</strong></td>
<td class="center"></td>
<td class="center">x</td>
<td class="center">x</td>
<td>Displays sites of your choice</td>
</tr>
<tr>
<td><strong>Sites in Category</strong></td>
<td class="center"></td>
<td class="center">x</td>
<td class="center">x</td>
<td>Displays sites from the Site Directory within a specific category</td>
</tr>
<tr class="light">
<td><strong>Table of Contents</strong></td>
<td class="center"></td>
<td class="center">x</td>
<td class="center">x</td>
<td>Displays the navigation hierarchy of your site.</td>
</tr>
<tr>
<td><strong>Web Analytics web part</strong></td>
<td class="center"></td>
<td class="center">x</td>
<td class="center">x</td>
<td>Displays the most viewed content, most popular search queries, or most popular clicked search results as reported by Web Analytics for the site or site collection</td>
</tr>
<tr class="light">
<td><strong>WSRP Viewer</strong></td>
<td class="center"></td>
<td></td>
<td class="center">x</td>
<td>Displays portlets from web sites using WSRP 1.1.</td>
</tr>
<tr>
<td><strong>XML Viewer</strong></td>
<td class="center">x</td>
<td class="center">x</td>
<td class="center">x</td>
<td>Transforms XML data using XSL and shows the results</td>
</tr>
<tr class="dark">
<td><strong>Filters</strong></td>
<td class="center"></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td><strong>Choice Filter</strong></td>
<td class="center"></td>
<td></td>
<td class="center">x</td>
<td>Filters the contents of Web Parts using a list of values entered by the page author</td>
</tr>
<tr class="light">
<td><strong>Current User Filter</strong></td>
<td class="center"></td>
<td></td>
<td class="center">x</td>
<td>Filters the contents of Web Parts by using properties of the current user.</td>
</tr>
<tr>
<td><strong>Data Filter</strong></td>
<td class="center"></td>
<td></td>
<td class="center">x</td>
<td>Filter the contents of Web Parts by allowing users to enter or pick a date.</td>
</tr>
<tr class="light">
<td><strong>Filter Actions</strong></td>
<td class="center"></td>
<td></td>
<td class="center">x</td>
<td>Use the Filter Actions Web Part when you have two or more filter Web Parts on one Web Part Page, and you want to synchronize the display of the filter results</td>
</tr>
<tr>
<td><strong>Page Field Filter</strong></td>
<td class="center"></td>
<td></td>
<td class="center">x</td>
<td>Filters the contents of Web Parts using information about the current page.</td>
</tr>
<tr class="light">
<td><strong>Query String (URL) Filter</strong></td>
<td class="center"></td>
<td></td>
<td class="center">x</td>
<td>Filters the contents of Web Parts using values passed via the query string.</td>
</tr>
<tr>
<td><strong>SharePoint List Filter</strong></td>
<td class="center"></td>
<td></td>
<td class="center">x</td>
<td>Filters the contents of Web Parts by using a list of values.</td>
</tr>
<tr class="light">
<td><strong>SQL Server Analysis Services Filter</strong></td>
<td class="center"></td>
<td></td>
<td class="center">x</td>
<td>Filters the contents of Web Parts using a list of values from SQL Server Analysis Services cubes.</td>
</tr>
<tr>
<td><strong>Text Filter</strong></td>
<td class="center"></td>
<td></td>
<td class="center">x</td>
<td>Filters the contents of Web Parts by allowing users to enter a text value.</td>
</tr>
<tr class="dark">
<td><strong>Forms</strong></td>
<td class="center"></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td><strong>HTML Form Web Part</strong></td>
<td class="center">x</td>
<td class="center">x</td>
<td class="center">x</td>
<td>Connects simple form controls to other web parts</td>
</tr>
<tr class="light">
<td><strong>InfoPath Form Web Part</strong></td>
<td class="center"></td>
<td></td>
<td class="center">x</td>
<td>Use this Web Part to display an InfoPath browser-enabled form.</td>
</tr>
<tr class="dark">
<td><strong>Media &amp; Content</strong></td>
<td class="center"></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td><strong>Content Editor</strong></td>
<td class="center">x</td>
<td class="center">x</td>
<td class="center">x</td>
<td>Allows authors to enter rich text content</td>
</tr>
<tr class="light">
<td><strong>Image Viewer</strong></td>
<td class="center">x</td>
<td class="center">x</td>
<td class="center">x</td>
<td>Displays a specified image</td>
</tr>
<tr>
<td><strong>Page Viewer</strong></td>
<td class="center">x</td>
<td class="center">x</td>
<td class="center">x</td>
<td>Displays another Web page on this Web Page. The other Web page is presented in an iFrame</td>
</tr>
<tr class="light">
<td><strong>Picture Library Slideshow Web Part</strong></td>
<td class="center">x</td>
<td class="center">x</td>
<td class="center">x</td>
<td>Use to display a slideshow of images and photos from a picture library</td>
</tr>
<tr>
<td><strong>Silverlight Web Part</strong></td>
<td class="center">x</td>
<td class="center">x</td>
<td class="center">x</td>
<td>A web part to display a Silverlight application</td>
</tr>
<tr class="dark">
<td><strong>Outlook Web App</strong></td>
<td class="center"></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td><strong>My Calendar</strong></td>
<td class="center"></td>
<td class="center">x</td>
<td class="center">x</td>
<td>Displays your calendar using Outlook Web Access for Microsoft Exchange Server 2003 or later</td>
</tr>
<tr class="light">
<td><strong>My Contacts</strong></td>
<td class="center"></td>
<td class="center">x</td>
<td class="center">x</td>
<td>Displays your contacts using Outlook Web Access for Microsoft Exchange Server 2003 or later</td>
</tr>
<tr>
<td><strong>My Inbox</strong></td>
<td class="center"></td>
<td class="center">x</td>
<td class="center">x</td>
<td>Displays your inbox using Outlook Web Access for Microsoft Exchange Server 2003 or later</td>
</tr>
<tr class="light">
<td><strong>My Mail Folder</strong></td>
<td class="center"></td>
<td class="center">x</td>
<td class="center">x</td>
<td>Displays your mail folder using Outlook Web Access for Microsoft Exchange Server 2000 or later</td>
</tr>
<tr>
<td><strong>My Tasks</strong></td>
<td class="center"></td>
<td class="center">x</td>
<td class="center">x</td>
<td>Displays your tasks using Outlook Web Access for Microsoft Exchange Server 2003 or later</td>
</tr>
<tr class="dark">
<td><strong>Search</strong></td>
<td class="center"></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td><strong>Advanced Search Box</strong></td>
<td class="center"></td>
<td class="center">x</td>
<td class="center">x</td>
<td>Displays parameterized search options based on properties and combinations of words</td>
</tr>
<tr class="light">
<td><strong>Dual Chinese Search</strong></td>
<td class="center"></td>
<td class="center">x</td>
<td class="center">x</td>
<td>Used to search Dual Chinese document and items at the same time.</td>
</tr>
<tr>
<td><strong>Federated Results</strong></td>
<td class="center"></td>
<td class="center">x</td>
<td class="center">x</td>
<td>Displays search results from a configured location</td>
</tr>
<tr class="light">
<td><strong>People Refinement Panel</strong></td>
<td class="center"></td>
<td class="center">x</td>
<td class="center">x</td>
<td>This webpart helps the users to refine people search results</td>
</tr>
<tr>
<td><strong>People Search Box</strong></td>
<td class="center"></td>
<td class="center">x</td>
<td class="center">x</td>
<td>Presents a search box that allows users to search for people</td>
</tr>
<tr class="light">
<td><strong>People Search Core Results</strong></td>
<td class="center"></td>
<td class="center">x</td>
<td class="center">x</td>
<td>Displays the people search results and the properties associated with them</td>
</tr>
<tr>
<td><strong>Refinement Panel</strong></td>
<td class="center"></td>
<td class="center">x</td>
<td class="center">x</td>
<td>This webpart helps the users to refine search results</td>
</tr>
<tr class="light">
<td><strong>Related Queries</strong></td>
<td class="center"></td>
<td class="center">x</td>
<td class="center">x</td>
<td>This webpart displays related queries to a user query</td>
</tr>
<tr>
<td><strong>Search Action Links</strong></td>
<td class="center"></td>
<td class="center">x</td>
<td class="center">x</td>
<td>Displays the search action links on the search results page</td>
</tr>
<tr class="light">
<td><strong>Search Best Bets</strong></td>
<td class="center"></td>
<td class="center">x</td>
<td class="center">x</td>
<td>Displays high-confidence results on a search results page.</td>
</tr>
<tr>
<td><strong>Search Box</strong></td>
<td class="center"></td>
<td class="center">x</td>
<td class="center">x</td>
<td>Displays a search box that allows users to search for information</td>
</tr>
<tr class="light">
<td><strong>Search Core Results</strong></td>
<td class="center"></td>
<td class="center">x</td>
<td class="center">x</td>
<td>Displays the search results and the properties associated with them</td>
</tr>
<tr>
<td><strong>Search Paging</strong></td>
<td class="center"></td>
<td class="center">x</td>
<td class="center">x</td>
<td>Display links for navigating pages containing search results.</td>
</tr>
<tr class="light">
<td><strong>Search Statistics</strong></td>
<td class="center"></td>
<td class="center">x</td>
<td class="center">x</td>
<td>Displays the search statistics such as the number of results shown on the current page, total number of results and time taken to perform the search.</td>
</tr>
<tr>
<td><strong>Search Summary</strong></td>
<td class="center"></td>
<td class="center">x</td>
<td class="center">x</td>
<td>Displays suggestions for current search query.</td>
</tr>
<tr class="light">
<td><strong>Search Visual Best Bet</strong></td>
<td class="center"></td>
<td></td>
<td class="center">x</td>
<td>Displays Visual Best Bet</td>
</tr>
<tr>
<td><strong>Top Federated Results</strong></td>
<td class="center"></td>
<td class="center">x</td>
<td class="center">x</td>
<td>Displays the Top Federated result from the configured location.</td>
</tr>
<tr class="dark">
<td><strong>Social Collaboration</strong></td>
<td class="center"></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td><strong>Contact Details</strong></td>
<td class="center"></td>
<td class="center">x</td>
<td class="center">x</td>
<td>Displays details about a contact for this page or site</td>
</tr>
<tr class="light">
<td><strong>Note Board</strong></td>
<td class="center"></td>
<td class="center">x</td>
<td class="center">x</td>
<td>Enable users to leave short, publicly-viewable notes about this page</td>
</tr>
<tr>
<td><strong>Organization Browser</strong></td>
<td class="center"></td>
<td class="center">x</td>
<td class="center">x</td>
<td>This Web Part displays each person in the reporting chain in an interactive view optimized for browsing organization charts.</td>
</tr>
<tr class="light">
<td><strong>Site Users</strong></td>
<td class="center">x</td>
<td class="center">x</td>
<td class="center">x</td>
<td>Use the Site Users Web Part to see a list of the site users and their online status</td>
</tr>
<tr>
<td><strong>User Tasks</strong></td>
<td class="center">x</td>
<td class="center">x</td>
<td class="center">x</td>
<td>Displays tasks that are assigned to the current user.</td>
</tr>
<tr class="light">
<td><strong>Tag Cloud</strong></td>
<td class="center"></td>
<td class="center">x</td>
<td class="center">x</td>
<td>Displays the most popular subjects being tagged inside your organization</td>
</tr>
</tbody>
</table>
<p>There are also a large amount of web parts that appear either when you enable certain features, or add them to the web part gallery manually. Some common examples are the Content Query Web Part and the Media Web Part (added automatically for sites based on the publishing or collaboration site templates). There are a large amount of these so I’m only showing a few to give you an indication of what else is available. To have a look at the full list navigate to <strong>Site Actions &gt; Site Settings &gt; Galleries | Web parts </strong>from the site collection root and then select <strong>Documents &gt; New Document</strong> from the ribbon. This will give you a list of all web parts available to add to the new web part menu.</p>
<p>Some of the additional web parts available in SharePoint 2010:</p>
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<th>Web Parts by Category</th>
<th>SharePoint Foundation</th>
<th>SharePoint Server 2010 Standard</th>
<th>SharePoint Server 2010 Enterprise</th>
<th>Description</th>
</tr>
<tr class="dark">
<td><strong>Publishing</strong></td>
<td class="center"></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td><strong>Media Web Part</strong></td>
<td class="center"></td>
<td class="center">x</td>
<td class="center">x</td>
<td>Use to embed media clips (video and audio) in a web page.</td>
</tr>
<tr class="light">
<td><strong>Content Query</strong></td>
<td class="center"></td>
<td class="center">x</td>
<td class="center">x</td>
<td>Displays a dynamic view of content from your site.</td>
</tr>
<tr>
<td><strong>Summary Links</strong></td>
<td class="center"></td>
<td class="center">x</td>
<td class="center">x</td>
<td>Allows authors to create links that can be grouped and styled.</td>
</tr>
<tr class="dark">
<td><strong>Miscellaneous</strong></td>
<td class="center"></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td><strong>List View Web Part</strong></td>
<td class="center">x</td>
<td class="center">x</td>
<td class="center">x</td>
<td>Use to display a view of a list or document library</td>
</tr>
<tr class="light">
<td><strong>Blog Year Archive</strong></td>
<td class="center">x</td>
<td class="center">x</td>
<td class="center">x</td>
<td>Displays the blog archive of the previous three years.</td>
</tr>
<tr>
<td><strong>Document Set Contents</strong></td>
<td class="center"></td>
<td class="center">x</td>
<td class="center">x</td>
<td>Displays the contents of a Document Set</td>
</tr>
<tr class="light">
<td><strong>Document Set Properties</strong></td>
<td class="center"></td>
<td class="center">x</td>
<td class="center">x</td>
<td>Displays the properties of the Document Set</td>
</tr>
<tr>
<td><strong>Enter a Document ID</strong></td>
<td class="center"></td>
<td class="center">x</td>
<td class="center">x</td>
<td>Finds a document by its Document ID</td>
</tr>
<tr class="light">
<td><strong>My Links</strong></td>
<td class="center"></td>
<td class="center">x</td>
<td class="center">x</td>
<td>Displays a list of a users ‘My Links’</td>
</tr>
<tr>
<td><strong>What&#8217;s New</strong></td>
<td class="center">x</td>
<td class="center">x</td>
<td class="center">x</td>
<td>This Web Part shows new information from specified lists and libraries.</td>
</tr>
<tr class="light">
<td><strong>Whereabouts</strong></td>
<td class="center">x</td>
<td class="center">x</td>
<td class="center">x</td>
<td>Use to display Whereabouts information</td>
</tr>
<tr class="dark">
<td><strong>PerformancePoint</strong></td>
<td class="center"></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td><strong>PerformancePoint Filter</strong></td>
<td class="center"></td>
<td></td>
<td class="center">x</td>
<td>This web part displays PerformancePoint filters. Filters may be linked to other web parts to provide an interactive dashboard experience. Filter types include lists and trees based on a variety of data sources.</td>
</tr>
<tr class="light">
<td><strong>PerformancePoint Report</strong></td>
<td class="center"></td>
<td></td>
<td class="center">x</td>
<td>This web part displays PerformancePoint reports. Reports may be linked to other web parts to create an interactive dashboard experience. Report types include: Analytic charts &amp; grids, Strategy Maps, Excel Services, Reporting Services, Predictive Trend charts, and web pages.</td>
</tr>
<tr>
<td><strong>PerformancePoint Scorecard</strong></td>
<td class="center"></td>
<td></td>
<td class="center">x</td>
<td>This web part displays a PerformancePoint scorecard. Scorecards may be linked to other web parts, such as filters and reports, to create an interactive dashboard experience.</td>
</tr>
<tr class="light">
<td><strong>PerformancePoint Stack Selector</strong></td>
<td class="center"></td>
<td></td>
<td class="center">x</td>
<td>This web part displays a PerformancePoint Stack Selector. All PerformancePoint web parts, such as filters and reports, contained in the same zone will be automatically stacked and selectable using this web part.</td>
</tr>
</tbody>
</table>
    <div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/AriBakker?a=QTIfTGvzHUk:qy6xlKbjlg0:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/AriBakker?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AriBakker?a=QTIfTGvzHUk:qy6xlKbjlg0:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/AriBakker?i=QTIfTGvzHUk:qy6xlKbjlg0:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AriBakker?a=QTIfTGvzHUk:qy6xlKbjlg0:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/AriBakker?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AriBakker?a=QTIfTGvzHUk:qy6xlKbjlg0:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/AriBakker?i=QTIfTGvzHUk:qy6xlKbjlg0:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AriBakker?a=QTIfTGvzHUk:qy6xlKbjlg0:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/AriBakker?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/AriBakker/~4/QTIfTGvzHUk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sharepointconfig.com/2010/06/sharepoint-2010-web-parts-by-license-type/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://www.sharepointconfig.com/2010/06/sharepoint-2010-web-parts-by-license-type/</feedburner:origLink></item>
		<item>
		<title>Indicative SharePoint 2010 Licensing Costs</title>
		<link>http://feedproxy.google.com/~r/AriBakker/~3/XNW8KHwQgCw/</link>
		<comments>http://www.sharepointconfig.com/2010/05/indicative-sharepoint-2010-licencing-costs/#comments</comments>
		<pubDate>Thu, 27 May 2010 21:02:50 +0000</pubDate>
		<dc:creator>Ari Bakker</dc:creator>
				<category><![CDATA[2010]]></category>
		<category><![CDATA[Features]]></category>
		<category><![CDATA[Planning]]></category>
		<category><![CDATA[comparison]]></category>
		<category><![CDATA[Licensing]]></category>

		<guid isPermaLink="false">http://www.sharepointconfig.com/?p=723</guid>
		<description><![CDATA[SharePoint licensing is a complex subject. As well as there being multiple product configuration options, license prices often depend on a number of factors such as the type of organisation, the relationship with Microsoft and/or licensing retailer etc. It is useful, however, to have a rough indication of how much a product will cost when planning a project. For example if you are interested in giving all internal users access to FAST search you are looking at roughly twice the licensing costs of an installation using the standard features. 

<img class="excerpt" src="http://www.sharepointconfig.com/wp-content/uploads/2010/05/licence-plate.jpg" alt="licence plate"/>
<div xmlns:cc="http://creativecommons.org/ns#" about="http://www.flickr.com/photos/adelmann/2212824575/"><p>Photo by <a rel="cc:attributionURL" href="http://www.flickr.com/photos/adelmann/2212824575/">anadelmann</a> / <a rel="license" href="http://creativecommons.org/licenses/by-nc-nd/2.0/">CC BY-NC-ND 2.0</a></p></div>]]></description>
			<content:encoded><![CDATA[<p>SharePoint licensing is a complex subject. As well as there being multiple product configuration options, license prices often depend on a number of factors such as the type of organisation, the relationship with Microsoft and/or licensing retailer etc. It is useful, however, to have a rough indication of how much a product will cost when planning a project. For example if you are interested in giving all internal users access to FAST search you are looking at roughly twice the licensing costs of an installation using the standard features<sup><a href="#note1">1</a></sup>.</p>
<h2>SharePoint 2010 Licensing Overview</h2>
<p>Before getting to the numbers there are a few things to understand. I’ve covered the basics here but head to the <a href="http://sharepoint.microsoft.com/en-us/buy/Pages/Licensing-Details.aspx">official Licensing Q&amp;A</a> page for full details.</p>
<p>For the full version of SharePoint Server 2010 there are two licensing models:</p>
<ul>
<li><strong>Server + CAL licenses for internal users</strong> – for internal users you need to license each server running SharePoint 2010. You also need a Client Access License (CAL) for each person (or optionally each device) accessing a SharePoint Server. All users will need a standard CAL and to access enterprise features users will need both the standard and the enterprise CAL. The difference in <a href="#comparison">Standard vs Enterprise features</a> is covered below.</li>
<li><strong>Internet sites server licenses for external users</strong> – you need a server license for each server running SharePoint 2010. CALs are not required if all content is accessible to external users. If some content is for internal use only then CALs are required for users accessing this content. As well as a difference in features the Internet Sites Standard license only allows sites running on a single domain. As stated in the <a href="http://www.microsoftvolumelicensing.com/userights/Downloader.aspx?DocumentId=2999">Microsoft Licensing Product Use Rights</a> “The [SharePoint 2010 Internet Sites Standard] software may only be used to create and host a single site at a time resolved from a single domain name (e.g., contoso.com) and its subdomains (e.g. support.contoso.com).” It comes in at almost a third of the cost of the enterprise license, however, so opens up public SharePoint hosting to companies with smaller budgets.</li>
</ul>
<h3>FAST Search Licensing</h3>
<p>FAST Search is licensed separately so to take advantage of all the enterprise search features you will need additional server licenses for servers running the FAST Search software.</p>
<p>It is also possible to use a single server for any of the above server licenses. For example if you wanted to run an Intranet and a public Internet website on the same server you could apply the SharePoint 2010 Server license as well as the SharePoint 2010 Internet Sites license to a single server. A FAST license can also be applied to a SharePoint 2010 server if required (saving hardware costs but still requiring SharePoint Server and FAST licenses).</p>
<h2>Indicative SharePoint 2010 License Costs</h2>
<p>The table below gives some indicative prices for SharePoint 2010 in the UK based on information from Microsoft. Note these are only intended to provide ballpark estimates only and you will need to contact a Microsoft Licensing Specialist to obtain accurate costs. These figures do not include software assurance. Additionally there are other license costs you will need to take into account such as Windows Server and SQL.</p>
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="308" valign="top"><strong>License</strong></td>
<td width="308" valign="top"><strong>Price</strong></td>
</tr>
<tr>
<td width="308" valign="top">SharePoint 2010 Server</td>
<td width="308" valign="top">~£3100</td>
</tr>
<tr>
<td width="308" valign="top">SharePoint 2010 Standard CAL</td>
<td width="308" valign="top">~£60</td>
</tr>
<tr>
<td width="308" valign="top">SharePoint 2010 Enterprise CAL*</td>
<td width="308" valign="top">~£53</td>
</tr>
<tr>
<td width="308" valign="top">SharePoint 2010 Internet Sites Standard</td>
<td width="308" valign="top">~£7,500</td>
</tr>
<tr>
<td width="308" valign="top">SharePoint 2010 Internet Sites Enterprise</td>
<td width="308" valign="top">~£27,000</td>
</tr>
<tr>
<td width="308" valign="top">FAST Search Server</td>
<td width="308" valign="top">~£14,000</td>
</tr>
</tbody>
</table>
<p>* Note the enterprise CAL is additive i.e. this requires each user to also have a standard CAL</p>
<p>Here are a few examples to give you an idea of how it works:</p>
<p><strong>Small, Standard License, Internal Only Environment</strong></p>
<p>3 server farm – 2 x WFE/Application servers and SQL, SharePoint 2010 running on two servers, 1,000 standard users</p>
<p>License costs would be 2 x £3,100 (SharePoint 2010 Server) + 1,000 users x £60 (Standard CAL) = £66,200</p>
<p>If you wanted to add FAST search you would need to add at least one server at £14,000 and add enterprise CALs (an additional £53 per user) for users accessing these features. The total with FAST would be £66,200 + £14,000 + 1000 x £53 = £133,200 for all users. An alternative would be to only give certain users access to the enterprise features. This can be done through the use of <strong>Feature Packs</strong> (a.k.a Sets) which allow you to target features so they can only be activated on certain sites. This is useful both for hosted scenarios (e.g. it allows the hoster to restrict enterprise features to site collections that are subscribed to an enterprise plan), and internal scenarios (e.g. only allowing a management site access to enterprise features to reduce license costs).</p>
<p><strong>SharePoint 2010 for a public facing internet site</strong></p>
<p>3 server farm – 2 x WFE/Application servers and SQL, SharePoint running on two servers, content authors editing content that ends up being publicly available (i.e. no internal only content) on a single domain</p>
<p>License costs would be 2 x £7,500 = £15,000</p>
<p>If you wanted to add FAST you would need the Internet Sites Enterprise license to make the search features available and add a license for a FAST Search Server (although this could run on one of the WFE’s to save hardware costs). This would then be 2x £27,000 + £14,000 = £68,000.</p>
<h2><a name="comparison"></a>Enterprise vs Standard SharePoint 2010 features</h2>
<p>So what do you get for an enterprise license? The official Microsoft SharePoint site has a <a href="http://sharepoint.microsoft.com/en-us/buy/Pages/Editions-Comparison.aspx">detailed comparison of features</a> in each of the editions but at a high level the additional features provided in the <strong>enterprise</strong> license are:</p>
<ul>
<li>Access Services</li>
<li>FAST search enhancements (note these also require a FAST server license)
<ul>
<li>Sorting by any managed property</li>
<li>Contextual search results (i.e. user or audience targeted)</li>
<li>Refinement filter counts</li>
<li>Similar results</li>
<li>Thumbnails and previews</li>
<li>Visual best bets</li>
<li>Scale and other search platform enhancements</li>
</ul>
</li>
<li>Business Intelligence
<ul>
<li>KPI’s</li>
<li>Chart Web Parts</li>
<li>Dashboards</li>
<li>Data Connection Library</li>
<li>Excel Services</li>
<li>PowerPivot for SharePoint</li>
<li>PerformancePoint Services</li>
<li>Visio Services</li>
</ul>
</li>
<li>InfoPath Services</li>
<li><del datetime="2010-06-21T17:18:18+00:00">Web Analytics</del> [update 21/06/10 - corrected - this is in standard]</li>
</ul>
<h3>Related products</h3>
<ul>
<li><strong>SharePoint Foundation 2010</strong> &#8211; this is free with Windows Server</li>
<li><strong>Office SharePoint Designer</strong> – free download from Microsoft</li>
<li><strong>Office Web Apps</strong> &#8211; free for each user with a licensed version of Microsoft Office</li>
<li><strong>SharePoint Workspace</strong> – included with Office Professional Plus or available separately for approx. £85</li>
</ul>
<p><sup><a name="note1"></a> Note 1 e.g. four SharePoint 2010 Server licenses @ £3100 + 1000 Standard CALs @ £60 = <strong>£72,400</strong>. Including FAST would require an additional FAST license @ £14,000 plus 1000 Enterprise CALs @ £53 = an <strong>additional £67,000</strong> (i.e. almost double) to give all users access.</sup></p>
    <div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/AriBakker?a=XNW8KHwQgCw:DOMk4Xs8IPk:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/AriBakker?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AriBakker?a=XNW8KHwQgCw:DOMk4Xs8IPk:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/AriBakker?i=XNW8KHwQgCw:DOMk4Xs8IPk:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AriBakker?a=XNW8KHwQgCw:DOMk4Xs8IPk:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/AriBakker?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AriBakker?a=XNW8KHwQgCw:DOMk4Xs8IPk:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/AriBakker?i=XNW8KHwQgCw:DOMk4Xs8IPk:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AriBakker?a=XNW8KHwQgCw:DOMk4Xs8IPk:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/AriBakker?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/AriBakker/~4/XNW8KHwQgCw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sharepointconfig.com/2010/05/indicative-sharepoint-2010-licencing-costs/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		<feedburner:origLink>http://www.sharepointconfig.com/2010/05/indicative-sharepoint-2010-licencing-costs/</feedburner:origLink></item>
		<item>
		<title>SharePoint 2010 Beta Exams Available</title>
		<link>http://feedproxy.google.com/~r/AriBakker/~3/3mzCOwjceUE/</link>
		<comments>http://www.sharepointconfig.com/2010/05/sharepoint-2010-beta-exams-available/#comments</comments>
		<pubDate>Thu, 20 May 2010 08:08:52 +0000</pubDate>
		<dc:creator>Ari Bakker</dc:creator>
				<category><![CDATA[Events]]></category>
		<category><![CDATA[Resources]]></category>
		<category><![CDATA[exams]]></category>

		<guid isPermaLink="false">http://www.sharepointconfig.com/?p=720</guid>
		<description><![CDATA[The Born to Learn Blog just announced that registration is now open for the SharePoint 2010 beta exams. Head over to their blog to get the registration codes as these let you take the test for free and if you pass you get the full certification. The idea is you do the TS one first [...]]]></description>
			<content:encoded><![CDATA[<p>The Born to Learn Blog just announced that <a href="http://borntolearn.mslearn.net/btl/b/weblog/archive/2010/05/19/register-for-sharepoint-2010-beta-exams.aspx">registration is now open for the SharePoint 2010 beta exams</a>. Head over to their blog to get the <a href="http://borntolearn.mslearn.net/btl/b/weblog/archive/2010/05/19/register-for-sharepoint-2010-beta-exams.aspx">registration codes</a> as these let you take the test for free and if you pass you get the full certification. The idea is you do the TS one first and the PRO one is a bit more tech lead/architect based.</p>
<p>I think the exams are a great way to learn about more than what you focus on day-to-day as they cover a wide range of features included in the SharePoint platform. So if you have been working with SharePoint for a while now is a great chance to have a shot as there is nothing to lose (apart from a bit of pride perhaps).</p>
<p>You can sign up for an exam at <a href="http://www.register.prometric.com/ClientInformation.asp">http://www.register.prometric.com/ClientInformation.asp</a> although when I booked yesterday it took a few attempts to get through and places were filling up fast. The following exams are available:</p>
<h3>Developer exams</h3>
<p>71-573: <a href="http://www.microsoft.com/learning/en/us/Exam.aspx?ID=70-573">TS: Microsoft SharePoint 2010, Application Development</a></p>
<p>71-576: <a href="http://www.microsoft.com/learning/en/us/Exam.aspx?ID=70-576">PRO: Designing and Developing Microsoft SharePoint 2010 Applications</a></p>
<h3>IT Pro exams</h3>
<p>71-667: <a href="http://www.microsoft.com/learning/en/us/Exam.aspx?ID=70-667">TS: Microsoft SharePoint 2010, Configuring</a></p>
<p>71-668: <a href="http://www.microsoft.com/learning/en/us/Exam.aspx?ID=70-668">PRO: Microsoft SharePoint 2010, Administrator</a></p>
<p>There is also a webcast today covering what you need to know for the 70-573 exam – details at <a href="http://borntolearn.mslearn.net/btl/b/weblog/archive/2010/05/12/live-meeting-sharepoint-server-information-worker-and-collaboration-month.aspx">http://borntolearn.mslearn.net/btl/b/weblog/archive/2010/05/12/live-meeting-sharepoint-server-information-worker-and-collaboration-month.aspx</a>.</p>
<p>If you are interested in being one of the first to know about new exams check out the Born to Learn blog post about <a href="http://borntolearn.mslearn.net/btl/b/weblog/archive/2009/07/09/one_2D00_word_2D00_rhymes_2D00_with_2D00_sneezesign_2D00_me_2D00_up.aspx">becoming a Subject Matter Expert</a>. This involves filling in a short survey on the Microsoft Connect site about your experience, and which development activities you want to be part of (e.g. take a beta exam).</p>
    <div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/AriBakker?a=3mzCOwjceUE:OzcnC2xI5Ts:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/AriBakker?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AriBakker?a=3mzCOwjceUE:OzcnC2xI5Ts:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/AriBakker?i=3mzCOwjceUE:OzcnC2xI5Ts:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AriBakker?a=3mzCOwjceUE:OzcnC2xI5Ts:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/AriBakker?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AriBakker?a=3mzCOwjceUE:OzcnC2xI5Ts:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/AriBakker?i=3mzCOwjceUE:OzcnC2xI5Ts:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AriBakker?a=3mzCOwjceUE:OzcnC2xI5Ts:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/AriBakker?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/AriBakker/~4/3mzCOwjceUE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sharepointconfig.com/2010/05/sharepoint-2010-beta-exams-available/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.sharepointconfig.com/2010/05/sharepoint-2010-beta-exams-available/</feedburner:origLink></item>
		<item>
		<title>SharePoint Evolution Conference Findability Slides</title>
		<link>http://feedproxy.google.com/~r/AriBakker/~3/4b5IFM3h3aE/</link>
		<comments>http://www.sharepointconfig.com/2010/05/sharepoint-evolution-conference-findability-slides/#comments</comments>
		<pubDate>Sat, 01 May 2010 14:00:27 +0000</pubDate>
		<dc:creator>Ari Bakker</dc:creator>
				<category><![CDATA[Events]]></category>
		<category><![CDATA[Information Architecture]]></category>
		<category><![CDATA[findability]]></category>

		<guid isPermaLink="false">http://www.sharepointconfig.com/?p=708</guid>
		<description><![CDATA[Last week I presented at the <a href="http://www.sharepointevolutionconference.com/">SharePoint Evolution Conference</a> in London. I’ve put my slides on slideshare for my session on ‘<a href="http://www.slideshare.net/aribakker/tag-driven-information-architecture-using-sharepoint-2007">creating a tag driven information architecture using SharePoint 2007</a>’. In the session I focused on making things findable, both in SharePoint 2007 and SharePoint 2010. 

<img class="excerpt" src="http://www.sharepointconfig.com/wp-content/uploads/2010/05/supermarket1.png" alt="supermarket aisle"/>]]></description>
			<content:encoded><![CDATA[<p>Last week I presented at the <a href="http://www.sharepointevolutionconference.com/">SharePoint Evolution Conference</a> in London. While the <a href="http://en.wikipedia.org/wiki/Air_travel_disruption_after_the_2010_Eyjafjallaj%C3%B6kull_eruption">ash cloud</a> meant Steve Smith had his work cut out for him trying to deal with a large number of missing international presenters, the Combined Knowledge team pulled through and put on a great conference. Eric Shupps has a great write up on <a href="http://www.binarywave.com/blogs/eshupps/Lists/Posts/Post.aspx?ID=236">the conference that almost wasn’t</a> for some more insight into the behind the scenes effort to make this a success. Full credit to Steve and the team for their herculean efforts.</p>
<p>I’ve put my slides on slideshare for my session on ‘<a href="http://www.slideshare.net/aribakker/tag-driven-information-architecture-using-sharepoint-2007">creating a tag driven information architecture using SharePoint 2007</a>’. In the session I focused on making things findable, both in SharePoint 2007 and SharePoint 2010. I also talked about other factors that are important in creating a successful intranet such as engaging the user and used the New Zealand Ministry of Transport as an example of how this can be done. As the slides were mostly visual cues for what I talked about in the session I’ve included a summary of what I covered below.</p>
<p>The presentation focused on using metadata to make things findable. This isn&#8217;t anything new, in fact during the Evolution keynote Steve Smith showed how that even in SharePoint 2001 there were basic metadata features but I&#8217;m constantly surprised at how many intranets are developed without proper use of what I consider fundamental features such as content types. If you understand how to use content types and metadata to make things findable this post probably won&#8217;t include anything new but if you haven&#8217;t I think this is one of the most important factors in delivering a successful intranet.</p>
<p><a href="http://www.sharepointconfig.com/wp-content/uploads/2010/05/supermarket.png"><img style="display: inline; margin-left: 0px; margin-right: 0px; border: 0px;" title="supermarket" src="http://www.sharepointconfig.com/wp-content/uploads/2010/05/supermarket_thumb.png" border="0" alt="supermarket" width="248" height="188" align="right" /></a> To explain how SharePoint can be used to improve findability I used the analogy of finding ‘curry paste’ in a supermarket (after confirming that the vast majority of the audience have also struggled finding items in a supermarket). To me it made sense to look for this under ‘ethnic foods’, but it wasn’t there &#8211; it was under ‘herbs and spices’. I suggested that there were two problems with the supermarket classification scheme:</p>
<ol>
<li>Items are only stored under a single <strong>section</strong>, even when it may make sense to have them in both locations (e.g. it would be easier to find curry paste if it was in the ‘<strong>ethnic foods</strong>’ and the ‘<strong>baking sauces</strong>’ section which was the second place I looked).</li>
<li>There is only one classification scheme – the <strong>section</strong> headings. I know other information about the curry paste such as the <strong>colour</strong> is <strong>red</strong> and I may want the <strong>size</strong> to be <strong>100-200 grams</strong>. The supermarket doesn’t let me search by these other metadata facets (but it would make it easier to find things if it did).</li>
</ol>
<p>While a supermarket is constrained by physical space and storing products in multiple places isn’t feasible this doesn’t apply to content management systems. Once the system is up it doesn’t matter how many pages we show this item on. As a result we can focus on how users look for information and provide multiple classification schemes and put information in places that make sense to different people. Note I’ve built this on a similar concept covered by Zef Fugaz (who was responsible for the User Experience side of the Ministry of Transport Intranet) in his article <a href="http://www.zefamedia.com/websites/card-sorting-doesnt-cut-the-custard/">Card Sorting Doesn’t Cut the Custard</a>.</p>
<p><a href="http://www.sharepointconfig.com/wp-content/uploads/2010/05/informationfacets.png"><img style="display: inline; margin-left: 0px; margin-right: 0px; border: 0px;" title="information-facets" src="http://www.sharepointconfig.com/wp-content/uploads/2010/05/informationfacets_thumb.png" border="0" alt="information-facets" width="404" height="298" align="right" /></a> In the example of the Ministry of Transport site I showed an example of how people might start to think about a document on ‘How to use the Intranet’. Some people might think in terms of the <strong>business unit</strong> that owns the resources such as <strong>human resources</strong> (i.e. this is a staff guideline), but others might think it relates more to <strong>communications</strong> (i.e. the intranet is a communications tool). Equally others might think of the <strong>type of content</strong> such as a <strong>manual</strong> or guideline. In this example we have people thinking of multiple facets (business unit and content type) and in one case we have people thinking of different values for the same facet (i.e. HR and Communications business units).</p>
<p>We can use this to create an information architecture as shown below:</p>
<p><a href="http://www.sharepointconfig.com/wp-content/uploads/2010/05/metadatafacets.png"><img style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="metadata-facets" src="http://www.sharepointconfig.com/wp-content/uploads/2010/05/metadatafacets_thumb.png" border="0" alt="metadata-facets" width="644" height="347" /></a></p>
<p>In SharePoint the facets translate to site columns. Once we have these defined we can select which site columns relate to different types of content in a matrix as shown below:</p>
<p><a href="http://www.sharepointconfig.com/wp-content/uploads/2010/05/contenttypedefinition.png"><img style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="content-type-definition" src="http://www.sharepointconfig.com/wp-content/uploads/2010/05/contenttypedefinition_thumb.png" border="0" alt="content-type-definition" width="325" height="227" /></a></p>
<p>I showed how this works in SharePoint, with both documents and pages allowing authors to easily tag documents when they are created or uploaded.</p>
<p>Once we have this content tagged we can utilise this metadata in a variety of ways using standard SharePoint features such as:</p>
<p><strong>Filters</strong> – for example showing ‘Business Unit’ and ‘Content Type’ columns in a document library allows you to quickly filter results to find information such as Business Unit = Human Resources and Content Type = Manual to find the ‘how you use the intranet’ guide.</p>
<p><a href="http://www.sharepointconfig.com/wp-content/uploads/2010/05/sharepoint2007documentlibraryfilter.png"><img style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="sharepoint-2007-document-library-filter" src="http://www.sharepointconfig.com/wp-content/uploads/2010/05/sharepoint2007documentlibraryfilter_thumb.png" border="0" alt="sharepoint-2007-document-library-filter" width="644" height="477" /></a></p>
<p><strong>Related items</strong> – one easy way to do this is to use the content query web part which makes it easy to constuct a roll up of content matching a query. For example to show a list of recent staff manuals on a page for new starters you could use the CQWP with a filter such as Content Type = Manual and Business Unit = Human Resources.</p>
<p><a href="http://www.sharepointconfig.com/wp-content/uploads/2010/05/sharepoint2007contentquerywebpart.png"><img style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="sharepoint-2007-content-query-web-part" src="http://www.sharepointconfig.com/wp-content/uploads/2010/05/sharepoint2007contentquerywebpart_thumb.png" border="0" alt="sharepoint-2007-content-query-web-part" width="644" height="477" /></a></p>
<p>If the items are not in a single site collection you can also use the search core results web part to construct a query. For example to show the latest research from around the organisation you could use a fixed keyword query such as Content Type = Research (contenttype:research) and order by modified date. Note you can allow your own metadata properties to be used in search queries by creating managed metadata fields in your search configuration.</p>
<p><a href="http://www.sharepointconfig.com/wp-content/uploads/2010/05/sharepoint2007searchresults.png"><img style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="sharepoint-2007-search-results" src="http://www.sharepointconfig.com/wp-content/uploads/2010/05/sharepoint2007searchresults_thumb.png" border="0" alt="sharepoint-2007-search-results" width="644" height="484" /></a></p>
<p><strong>Search filters</strong> – the freely available <a href="http://facetedsearch.codeplex.com/">MOSS Faceted Search</a> components can also enhance search results by displaying relevant facets and allowing users to use these to filter the search results set.</p>
<p><a href="http://www.sharepointconfig.com/wp-content/uploads/2010/05/sharepoint2007facetedsearch.png"><img style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="sharepoint-2007-faceted-search" src="http://www.sharepointconfig.com/wp-content/uploads/2010/05/sharepoint2007facetedsearch_thumb.png" border="0" alt="sharepoint-2007-faceted-search" width="644" height="484" /></a></p>
<p>One thing that is important to note is that this system does rely on users tagging information appropriately and people often ask me about the best ways to do this. Some ways to ensure this happens are:</p>
<ul>
<li>Provide training to key content authors so they understand the process and see the benefits.</li>
<li>Configure certain fields to be mandatory &#8211; this needs careful consideration, too few may result in poor quality metadata, too many may mean users find it too difficult and save content elsewhere or classify items incorrectly.</li>
<li>Appoint owners for each section of the Intranet to ensure that content is appropriately tagged.</li>
<li>Another way is to use some sort of entity extraction tool to dynamically extract metadata. I haven&#8217;t looked into this in detail but products such as Fast Search for SharePoint 2010 provide a framework to achieve this.</li>
</ul>
<p>I also discussed ways to engage with staff so they would want to use the Intranet regularly. Examples of this were a ‘Story of the Day’ feature, frequently updated ‘Alerts’ and ‘Announcements’ listings, a staff marketplace, corporate calendars and opinion polls.</p>
<p>Lastly I covered some of the features that SharePoint 2010 includes that can be used to improve findability. I covered these in an earlier article on <a href="http://www.sharepointconfig.com/2010/04/10-ways-sharepoint-2010-improves-findability/">10 ways SharePoint 2010 improves findability</a>.</p>
<p>While the session was in the community track it was fairly well attended and I had lots of questions from the audience which was a good sign people were listening. As always any comments appreciated – I’d especially be interested in hearing about other people’s experiences using the metadata features of SharePoint.</p>
<p><strong>Additional resources</strong></p>
<ul>
<li><a href="http://blogs.msdn.com/sharepoint/archive/2008/04/29/how-we-did-it-tag-driven-information-architecture-using-moss-2007-for-the-new-zealand-ministry-of-transport.aspx">How We Did It &#8211; Tag Driven Information Architecture using MOSS 2007 for the New Zealand Ministry of Transport</a> – an article I wrote for the SharePoint Team Blog</li>
<li><a href="http://www.zefamedia.com/websites/card-sorting-doesnt-cut-the-custard/">Card Sorting Doesn’t Cut the Custard</a> – an article by fellow ex-<a href="http://www.provoke.co.nz/">Provoker</a> <a href="http://www.zefamedia.com/">Zef Fugaz</a></li>
<li><a href="http://www.slideshare.net/LuluP/information-architecture-and-sharepoint">Information Architecture and SharePoint</a> – a presentation by fellow ex-<a href="http://www.provoke.co.nz/">Provoker</a> <a href="http://www.lushai.com/">Lulu Pachuau</a></li>
<li><a href="http://www.sharepointconfig.com/2010/04/10-ways-sharepoint-2010-improves-findability/">10 ways SharePoint 2010 improves findability</a> – an article I wrote for EndUserSharePoint</li>
<li><a href="http://spthemes.com/">SPThemes</a> – The screenshots in this article show the Cedar Blue theme available from <a href="http://spthemes.com/">SPThemes.com</a></li>
</ul>
    <div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/AriBakker?a=4b5IFM3h3aE:fjoORnSXGlY:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/AriBakker?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AriBakker?a=4b5IFM3h3aE:fjoORnSXGlY:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/AriBakker?i=4b5IFM3h3aE:fjoORnSXGlY:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AriBakker?a=4b5IFM3h3aE:fjoORnSXGlY:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/AriBakker?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AriBakker?a=4b5IFM3h3aE:fjoORnSXGlY:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/AriBakker?i=4b5IFM3h3aE:fjoORnSXGlY:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AriBakker?a=4b5IFM3h3aE:fjoORnSXGlY:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/AriBakker?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/AriBakker/~4/4b5IFM3h3aE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sharepointconfig.com/2010/05/sharepoint-evolution-conference-findability-slides/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.sharepointconfig.com/2010/05/sharepoint-evolution-conference-findability-slides/</feedburner:origLink></item>
		<item>
		<title>10 ways SharePoint 2010 improves findability</title>
		<link>http://feedproxy.google.com/~r/AriBakker/~3/YiAef9aQbNs/</link>
		<comments>http://www.sharepointconfig.com/2010/04/10-ways-sharepoint-2010-improves-findability/#comments</comments>
		<pubDate>Wed, 14 Apr 2010 20:07:01 +0000</pubDate>
		<dc:creator>Ari Bakker</dc:creator>
				<category><![CDATA[2010]]></category>
		<category><![CDATA[Events]]></category>
		<category><![CDATA[Information Architecture]]></category>
		<category><![CDATA[Web Content Management]]></category>
		<category><![CDATA[Features]]></category>
		<category><![CDATA[findability]]></category>
		<category><![CDATA[information management]]></category>
		<category><![CDATA[sp2010]]></category>

		<guid isPermaLink="false">http://www.sharepointconfig.com/?p=685</guid>
		<description><![CDATA[Findability is one of the most important factors in the success of a SharePoint site. If users cannot find what they are looking they will quickly use alternate methods to get results. Employees that cannot find information are less productive and less likely to use the system in general. Likewise users that cannot find information on an internet site will look elsewhere for products and services losing the company revenue.

SharePoint 2007 introduced some powerful tools for improving findability but fell short when it compared to larger Enterprise Content Management systems. SharePoint 2010 takes this a huge step forward with cutting edge enterprise ready findability features. Here are 10 new features SharePoint 2010 brings to the table in addition to the features available in SharePoint 2007.

<img class="excerpt" src="http://www.sharepointconfig.com/wp-content/uploads/2010/04/sharepoint2010managedkeywordsfield_thumb.png" alt="sharepoint 2010 managed keywords"/>]]></description>
			<content:encoded><![CDATA[<p><em>This is a post I recently wrote for <a href="http://www.endusersharepoint.com/">EndUserSharePoint</a></em><em> in preparation for my session on “Creating a metadata driven information architecture using SharePoint 2007” at the </em><a href="http://sharepointevolutionconference.com/"><em>SharePoint Evolution Conference</em></a><em> in London next week. This conference has a talented line up of speakers and will be a great place to learn about SharePoint 2010. Although my session will focus on a </em><a href="http://www.sharepointconfig.com/2010/02/sharepoint-2010-evolution-conference/"><em>case study that involves SharePoint 2007</em></a><em> I’ll cover concepts that apply equally to SharePoint 2007 and SharePoint 2010 and show some of the new features in SharePoint 2010 (such as the ones below) as well.</em></p>
<p>Findability is one of the most important factors in the success of a SharePoint site. If users cannot find what they are looking they will quickly use alternate methods to get results. Employees that cannot find information are less productive and less likely to use the system in general. Likewise users that cannot find information on an internet site will look elsewhere for products and services losing the company revenue.</p>
<p>SharePoint 2007 introduced some powerful tools for improving findability but fell short when it compared to larger Enterprise Content Management systems. SharePoint 2010 takes this a huge step forward with cutting edge enterprise ready findability features. Here are 10 new features SharePoint 2010 brings to the table in addition to the features available in SharePoint 2007.</p>
<p><strong>1. </strong><strong>Metadata driven navigation</strong></p>
<p>SharePoint 2010 provides a rich set of features that allow users to use metadata to navigate content repositories. Document libraries can be configured to show navigation based on both the corporate taxonomy (or managed metadata) and combined with other metadata filters. For example with a you can filter items from the &#8216;Bicycle&#8217; product category of content type &#8216;Sales presentation&#8217; using the navigation as shown below.</p>
<p><a href="http://www.sharepointconfig.com/wp-content/uploads/2010/04/sharepoint2010metadatadrivennavigation.png"><img style="display: block; margin-left: auto; margin-right: auto; border: 0px initial initial;" title="sharepoint 2010 metadata driven navigation" src="http://www.sharepointconfig.com/wp-content/uploads/2010/04/sharepoint2010metadatadrivennavigation_thumb.png" border="0" alt="sharepoint-2010-metadata-driven-navigation" width="554" height="613" /></a></p>
<p><strong>2. </strong><strong>Search enhancements</strong></p>
<p>SharePoint 2010 includes some impressive enhancements to the search experience. Search facets allow users to filter the results by relevant metadata such as author or content type. Relevancy is improved as it takes the number of views into account. This, along with the addition of related queries, improved query syntax and thumbnail previews help users locate the content they are after.</p>
<p><a href="http://www.sharepointconfig.com/wp-content/uploads/2010/04/sharepoint2010searchfacets.png"><img style="display: block; margin-left: auto; margin-right: auto; border: 0px initial initial;" title="sharepoint 2010 search facets" src="http://www.sharepointconfig.com/wp-content/uploads/2010/04/sharepoint2010searchfacets_thumb.png" border="0" alt="sharepoint-2010-search-facets" width="554" height="444" /></a></p>
<p><strong>3. </strong><strong>Ratings</strong></p>
<p>The introduction of a ratings field allows community driven content classification. Ratings can be used to improve findability through sortable list columns, or by the creation of ‘highest rated documents’ rollups using the Content Query Web Part, allowing users to see popular content in prominent places.</p>
<p><a href="http://www.sharepointconfig.com/wp-content/uploads/2010/04/sharepoint2010rating.png"><img style="display: block; margin-left: auto; margin-right: auto; border: 0px initial initial;" title="sharepoint 2010 ratings" src="http://www.sharepointconfig.com/wp-content/uploads/2010/04/sharepoint2010rating_thumb.png" border="0" alt="sharepoint-2010-rating" width="514" height="261" /></a></p>
<p><strong>4. </strong><strong>Tagging</strong></p>
<p>SharePoint 2010 includes a tag cloud web part that provides a visual representation of the metadata associated with the content inside a repository. Additionally tag profile pages contain lists of items such as sites, documents or people tagged with a particular term as well as a list of community members and discussions facilitating information retrieval.</p>
<p><a href="http://www.sharepointconfig.com/wp-content/uploads/2010/04/sharepoint2010tagcloud.jpg"><img style="display: block; margin-left: auto; margin-right: auto; border: 0px initial initial;" title="sharepoint 2010 tag cloud" src="http://www.sharepointconfig.com/wp-content/uploads/2010/04/sharepoint2010tagcloud_thumb.jpg" border="0" alt="sharepoint-2010-tag-cloud" width="532" height="307" /></a></p>
<p><strong>5. </strong><strong>Document IDs</strong></p>
<p><a href="http://www.sharepointconfig.com/wp-content/uploads/2010/04/sharepoint2010documentid.png"><img style="display: inline; margin-left: 0px; margin-right: 0px; border: 0px;" title="sharepoint-2010-document-id" src="http://www.sharepointconfig.com/wp-content/uploads/2010/04/sharepoint2010documentid_thumb.png" border="0" alt="sharepoint-2010-document-id" width="245" height="60" align="right" /></a>SharePoint 2010 provides a unique Document ID service that can be used to create absolute references to content regardless of file renames or content moves. As well as resulting in a reduction in broken links the Document ID can be used to search for an individual document and the format of the ID is configurable allowing organisations to create meaningful document identifiers.</p>
<p><strong>Classification</strong></p>
<p>All the findability improvements mentioned above rely on the correct classification of content in the first place. The following five findability improvements aid the correct classification and organisation of content in SharePoint 2010.</p>
<p><strong>6. </strong><strong>Managed metadata service</strong></p>
<p>SharePoint 2010 now includes a dedicated service for managing metadata within the enterprise. The managed metadata service allows content owners to maintain a centrally managed structured taxonomy as well as allowing users to contribute to an unstructured &#8216;folksonomy&#8217; in the form of managed keywords. This makes it much easier for users to classify content, and guides users to use consistent terms, improving the quality of metadata in the system.</p>
<p>Structured classification:</p>
<p><a href="http://www.sharepointconfig.com/wp-content/uploads/2010/04/sharepoint2010managedmetadatafield.png"><img style="display: block; margin-left: auto; margin-right: auto; border: 0px initial initial;" title="sharepoint 2010 managed metadata field" src="http://www.sharepointconfig.com/wp-content/uploads/2010/04/sharepoint2010managedmetadatafield_thumb.png" border="0" alt="sharepoint-2010-managed-metadata-field" width="506" height="539" /></a></p>
<p>Unstructured classification:</p>
<p><a href="http://www.sharepointconfig.com/wp-content/uploads/2010/04/sharepoint2010managedkeywordsfield.png"><img style="display: block; margin-left: auto; margin-right: auto; border: 0px initial initial;" title="sharepoint 2010 managed keywords field" src="http://www.sharepointconfig.com/wp-content/uploads/2010/04/sharepoint2010managedkeywordsfield_thumb.png" border="0" alt="sharepoint-2010-managed-keywords-field" width="544" height="140" /></a></p>
<p><strong>7. </strong><strong>Shared content types</strong></p>
<p>One key architectural limitation in SharePoint 2007 was that Content Types could not be shared between site collections. This resulted in the duplication of content types and associated lookup lists which could become out of sync over time. SharePoint 2010 removes this limitation and thus improves the consistency of information stored in different site collections or even separate SharePoint farms.</p>
<p><strong>8. </strong><strong>Location based metadata defaults</strong></p>
<p>SharePoint 2010 allows you to set metadata defaults at the document library and folder level. This means that users do not have to enter the same metadata over and over if they are uploading content into a repository that has a shared set of metadata.</p>
<p><a href="http://www.sharepointconfig.com/wp-content/uploads/2010/04/sharepoint2010defaultcolumnvalues.png"><img style="display: block; margin-left: auto; margin-right: auto; border: 0px initial initial;" title="sharepoint 2010 default column values" src="http://www.sharepointconfig.com/wp-content/uploads/2010/04/sharepoint2010defaultcolumnvalues_thumb.png" border="0" alt="sharepoint-2010-default-column-values" width="554" height="258" /></a></p>
<p><strong>9. </strong><strong>Content Organiser</strong></p>
<p>In SharePoint 2007 the location in which content was stored was largely up to the end users. The Content Organiser in SharePoint 2010 helps alleviate problems caused by users uploading documents to a variety of different places by allowing routing decisions to be centrally managed. Content can then be routed to the correct location based on the content type and other metadata values. This helps the user to focus on providing quality metadata and results in a well organised repository.</p>
<p><strong>10. </strong><strong>Document Sets</strong></p>
<p>A document set allows you to manage a group of documents as a single entity. The ability to apply metadata to the entire set of documents improves consistency and storing related documents together can help users find relevant material easily.</p>
<p><strong>Summary </strong></p>
<p>SharePoint 2010 delivers some massive platform improvements that help in the classification and retrieval of content. It is important to note, however, that the toolset is only a small part of an information management strategy. Information management should start with clear business objectives, a clear strategy and right areas of focus before technology is involved. Once this is in place, however, the significant advancements of SharePoint 2010 make it a more obvious choice for content management than ever before.</p>
    <div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/AriBakker?a=YiAef9aQbNs:4fc1NRHWmqo:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/AriBakker?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AriBakker?a=YiAef9aQbNs:4fc1NRHWmqo:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/AriBakker?i=YiAef9aQbNs:4fc1NRHWmqo:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AriBakker?a=YiAef9aQbNs:4fc1NRHWmqo:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/AriBakker?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AriBakker?a=YiAef9aQbNs:4fc1NRHWmqo:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/AriBakker?i=YiAef9aQbNs:4fc1NRHWmqo:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AriBakker?a=YiAef9aQbNs:4fc1NRHWmqo:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/AriBakker?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/AriBakker/~4/YiAef9aQbNs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sharepointconfig.com/2010/04/10-ways-sharepoint-2010-improves-findability/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.sharepointconfig.com/2010/04/10-ways-sharepoint-2010-improves-findability/</feedburner:origLink></item>
		<item>
		<title>Securing the authentication cookie for mixed SSL SharePoint sites</title>
		<link>http://feedproxy.google.com/~r/AriBakker/~3/ZNf4hDL1fEI/</link>
		<comments>http://www.sharepointconfig.com/2010/04/partial-ssl-sharepoint-sites-securing-the-authentication-cookie/#comments</comments>
		<pubDate>Wed, 07 Apr 2010 22:46:43 +0000</pubDate>
		<dc:creator>Ari Bakker</dc:creator>
				<category><![CDATA[Configuration]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Authentication]]></category>
		<category><![CDATA[HTTPS]]></category>
		<category><![CDATA[SSL]]></category>

		<guid isPermaLink="false">http://www.sharepointconfig.com/?p=649</guid>
		<description><![CDATA[This is the fifth in a series of posts detailing <a href="http://www.sharepointconfig.com/tag/ssl/">how to configure a partially SSL secured SharePoint site</a>. This post will cover what is involved in ensuring the authentication cookie is only sent via a secure channel (i.e. SSL/HTTPS). This is <a href="http://msdn.microsoft.com/en-us/library/ms998310.aspx#paght000012_step3">best practice for securing forms based authentication</a> but has several impacts that can require some fundamental changes to the site so are worth considering early in the development process. 
 
<img class="excerpt" src="http://www.sharepointconfig.com/wp-content/uploads/2010/04/cookie.jpg" alt="cookie stolen from jar"/>
<div xmlns:cc="http://creativecommons.org/ns#" about="http://www.flickr.com/photos/a_funk/3482647938/"><p>Photo by <a rel="cc:attributionURL" href="http://www.flickr.com/photos/a_funk/3482647938/">a_funk</a> / <a rel="license" href="http://creativecommons.org/licenses/by-nc-nd/2.0/">CC BY-NC-ND 2.0</a></p></div>]]></description>
			<content:encoded><![CDATA[<p>This is the fifth in a series of posts detailing <a href="http://www.sharepointconfig.com/tag/ssl/">how to configure a partially SSL secured SharePoint site</a>. This post will cover what is involved in ensuring the authentication cookie is only sent via a secure channel (i.e. SSL/HTTPS). This is <a href="http://msdn.microsoft.com/en-us/library/ms998310.aspx#paght000012_step3">best practice for securing forms based authentication</a> but has several impacts that can require some fundamental changes to the site so are worth considering early in the development process.</p>
<p>Ensuring that the authentication cookie is only sent via SSL/HTTPS is easy, we simply add the ‘requireSSL’ attribute to our forms element in the web.config as shown below:</p>
<div id="codeSnippetWrapper" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; width: 97.5%; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; cursor: text; border: silver 1px solid; padding: 4px;">
<div id="codeSnippet" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">authentication</span> <span style="color: #ff0000;">mode</span><span style="color: #0000ff;">="Forms"</span><span style="color: #0000ff;">&gt;</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">forms</span> <span style="color: #ff0000;">loginUrl</span><span style="color: #0000ff;">="https://www.company.com/pages/login.aspx"</span> <span style="color: #ff0000;">requireSSL</span><span style="color: #0000ff;">="true"</span> <span style="color: #0000ff;">/&gt;</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">authentication</span><span style="color: #0000ff;">&gt;</span></pre>
</div>
</div>
<p>The impact it has, however, is that the <strong>authentication cookie is only sent when we request an HTTPS page</strong> (i.e. via SSL). This means that now if we login and then browse to the homepage we appear logged out! This is because the .ASPXAUTH cookie we covered in the first post “<a href="http://www.sharepointconfig.com/2010/03/securing-mixed-ssl-sites-in-sharepoint/">Securing mixed SSL sites in SharePoint</a>” is not sent for HTTP requests so ASP.NET cannot authenticate us. As a result HttpContext.Current.Request.IsAuthenticated will be false and the MembershipUser and SPContext.Current.Web.User will be null. This means that we cannot use a range of controls such as the ASP.NET LoginView, the SharePoint SPSecurityTrimmed control, the SharePoint Welcome controls and the ASP.NET and SharePoint navigation controls for rendering permissions based navigation.</p>
<p>To illustrate if we log in via HTTPS and then view the homepage we will see the following:</p>
<p><a href="http://www.sharepointconfig.com/wp-content/uploads/2010/04/sharepointanonymous.png"><img style="display: inline; border: 0px;" title="sharepoint-anonymous" src="http://www.sharepointconfig.com/wp-content/uploads/2010/04/sharepointanonymous_thumb.png" border="0" alt="sharepoint-anonymous" width="644" height="451" /></a></p>
<p>The main issues are that the welcome control shows ‘Sign In’ instead of ‘Welcome username’ and the navigation to the restricted ‘My Account’ site does not show.</p>
<p>What we ideally want is similar to what we configured in the previous example where we used the ASP.NET Login controls to create a personalised welcome control as shown below:</p>
<p><a href="http://www.sharepointconfig.com/wp-content/uploads/2010/04/sharepointhttpslogin1.png"><img style="display: inline; border: 0px;" title="sharepoint-https-login" src="http://www.sharepointconfig.com/wp-content/uploads/2010/04/sharepointhttpslogin_thumb1.png" border="0" alt="sharepoint-https-login" width="644" height="336" /></a></p>
<p>Rewriting the SharePoint and ASP.NET controls to work without the help of the ASP.NET security framework elements is not a trivial task and requires some thought. There are, however, several ways that we can resolve this issue:</p>
<ul>
<li>Put the entire site under SSL</li>
<li>Don’t show information that requires authentication on HTTP pages</li>
<li>Ensure all requests after the user logs in are over SSL</li>
<li>Store personalisation information in separate cookies that are sent via HTTP</li>
</ul>
<p>This article will cover the last option as this is often the requirement for public facing SharePoint internet sites. In this post we cover one possible solution to demonstrate the concepts that are required to replicate this functionality but it is not intended for production systems without careful consideration and testing.</p>
<h3>Solution overview</h3>
<p>This solution involves creating a separate cookie that will be configured to be sent via both HTTP and HTTPS. In this cookie we will store the username of the user when they log into the site so we can display this on HTTP pages.</p>
<p>To create a separate cookie we will need to add custom code to the login method to create this ‘soft authentication’ cookie when a user logs in. We can then use this cookie to display the user name and links relevant to the user on HTTP pages even when they appear to be anonymous. As long as we do not store private or authentication information in this cookie it does not pose a security risk as if an attacker steals this cookie they cannot log in to the site or view any private information (as the secure authentication cookie is still required to view this information.</p>
<h3>Step 1- Creating an authentication helper class</h3>
<p><a href="http://www.sharepointconfig.com/wp-content/uploads/2010/04/softauthenticationclass.png"><img style="display: inline; margin-left: 0px; margin-right: 0px; border: 0px;" title="softauthentication-class" src="http://www.sharepointconfig.com/wp-content/uploads/2010/04/softauthenticationclass_thumb.png" border="0" alt="softauthentication-class" width="196" height="127" align="right" /></a>To enable us to create and manage the custom cookie we will create a ‘SoftAuthentication’ class that contains methods to create and destroy the cookie when we login or logout. We will also create properties to retrieve a flag to indicate whether a user has logged in, and a property to retrieve the name of the currently logged in user.</p>
<p>An example implementation of this class is shown below.</p>
<div id="codeSnippetWrapper" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; width: 97.5%; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; cursor: text; border: silver 1px solid; padding: 4px;">
<div id="codeSnippet" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">class</span> SoftAuthentication</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">{</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">const</span> <span style="color: #0000ff;">string</span> softAuthCookie = <span style="color: #006080;">"softAuth"</span>;</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #008000;">/// &lt;summary&gt;</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #008000;">/// Returns true if the user has previously logged in and is now on an unsecure page</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #008000;">/// i.e. we cannot currently determine if they are logged in via forms authentication</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #008000;">/// &lt;/summary&gt;</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #008000;">/// &lt;returns&gt;&lt;/returns&gt;</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">bool</span> HasLoggedIn</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    {</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        get</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        {</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">            <span style="color: #0000ff;">if</span> (HttpContext.Current.Request.Cookies[softAuthCookie] == <span style="color: #0000ff;">null</span>)</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">                <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span>;</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">            <span style="color: #0000ff;">else</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">                <span style="color: #0000ff;">return</span> !<span style="color: #0000ff;">string</span>.IsNullOrEmpty(HttpContext.Current.Request.Cookies[softAuthCookie].Value);</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        }</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    }</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #008000;">/// &lt;summary&gt;</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #008000;">/// Retrieves the username of the soft authenticated user</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #008000;">/// &lt;/summary&gt;</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #008000;">/// &lt;returns&gt;&lt;/returns&gt;</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">string</span> LoginName</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    {</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        get</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        {</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">            <span style="color: #0000ff;">if</span> (HttpContext.Current.Request.Cookies[softAuthCookie] == <span style="color: #0000ff;">null</span>)</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">                <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">null</span>;</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">            <span style="color: #0000ff;">return</span> HttpContext.Current.Request.Cookies[softAuthCookie].Value;</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        }</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    }</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #008000;">/// &lt;summary&gt;</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #008000;">/// Perform a soft login and store the username for retrieval via HTTP</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #008000;">/// &lt;/summary&gt;</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #008000;">/// &lt;param name="value"&gt;&lt;/param&gt;</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span> Login(<span style="color: #0000ff;">string</span> <span style="color: #0000ff;">value</span>)</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    {</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        <span style="color: #0000ff;">if</span> (HttpContext.Current.Response.Cookies[softAuthCookie] == <span style="color: #0000ff;">null</span>)</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">            HttpContext.Current.Response.Cookies.Add(<span style="color: #0000ff;">new</span> HttpCookie(softAuthCookie, <span style="color: #0000ff;">value</span>));</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        <span style="color: #0000ff;">else</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">            HttpContext.Current.Response.Cookies[softAuthCookie].Value = <span style="color: #0000ff;">value</span>;</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    }</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #008000;">/// &lt;summary&gt;</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #008000;">/// Logout the soft authenticated user</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #008000;">/// &lt;/summary&gt;</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #008000;">/// &lt;param name="value"&gt;&lt;/param&gt;</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span> Logout()</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    {</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        <span style="color: #0000ff;">if</span> (HttpContext.Current.Response.Cookies[softAuthCookie] != <span style="color: #0000ff;">null</span>)</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">            HttpContext.Current.Response.Cookies[softAuthCookie].Value = <span style="color: #0000ff;">string</span>.Empty;</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    }</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">}</pre>
</div>
</div>
<h3>Step 2 &#8211; Creating a custom login view control</h3>
<p><a href="http://www.sharepointconfig.com/wp-content/uploads/2010/04/customloginview.png"><img style="display: inline; margin-left: 0px; margin-right: 0px; border: 0px;" title="custom-login-view" src="http://www.sharepointconfig.com/wp-content/uploads/2010/04/customloginview_thumb.png" border="0" alt="custom-login-view" width="349" height="135" align="right" /></a> To allow us to show different information to anonymous or logged in users we can create a control similar to the ASP.NET LoginView that contains templates for each group of users. The main difference is that we will use the SoftAuthentication.HasLoggedIn flag to determine which template to show instead of Request.IsAuthenticated. An example of this is shown below.</p>
<div id="codeSnippetWrapper" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; width: 97.5%; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; cursor: text; border: silver 1px solid; padding: 4px;">
<div id="codeSnippet" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">[ParseChildren(<span style="color: #0000ff;">true</span>), Bindable(<span style="color: #0000ff;">false</span>)]</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span> SoftLoginView : Control, INamingContainer</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">{</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #008000;">// Fields</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #0000ff;">private</span> ITemplate _anonymousTemplate;</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #0000ff;">private</span> ITemplate _loggedInTemplate;</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #008000;">// Methods</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #0000ff;">protected</span> <span style="color: #0000ff;">override</span> <span style="color: #0000ff;">void</span> CreateChildControls()</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    {</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        ITemplate anonymousTemplate = <span style="color: #0000ff;">null</span>;</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        <span style="color: #0000ff;">if</span> ((<span style="color: #0000ff;">base</span>.DesignMode || (<span style="color: #0000ff;">this</span>.Page == <span style="color: #0000ff;">null</span>)) || (!<span style="color: #0000ff;">this</span>.Page.Request.IsAuthenticated &amp;&amp; !SoftAuthentication.HasLoggedIn))</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        {</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">            anonymousTemplate = <span style="color: #0000ff;">this</span>.AnonymousTemplate;</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        }</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        <span style="color: #0000ff;">else</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        {</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">            anonymousTemplate = <span style="color: #0000ff;">this</span>.LoggedInTemplate;</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        }</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        <span style="color: #0000ff;">if</span> (anonymousTemplate != <span style="color: #0000ff;">null</span>)</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        {</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">            Control container = <span style="color: #0000ff;">new</span> Control();</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">            anonymousTemplate.InstantiateIn(container);</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">            <span style="color: #0000ff;">this</span>.Controls.Add(container);</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        }</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    }</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #0000ff;">protected</span> <span style="color: #0000ff;">override</span> <span style="color: #0000ff;">void</span> Render(HtmlTextWriter writer)</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    {</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        <span style="color: #0000ff;">this</span>.EnsureChildControls();</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        <span style="color: #0000ff;">base</span>.Render(writer);</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    }</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #008000;">// Properties</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    [PersistenceMode(PersistenceMode.InnerProperty), Browsable(<span style="color: #0000ff;">false</span>), DefaultValue((<span style="color: #0000ff;">string</span>)<span style="color: #0000ff;">null</span>), TemplateContainer(<span style="color: #0000ff;">typeof</span>(LoginView))]</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">virtual</span> ITemplate AnonymousTemplate</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    {</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        get</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        {</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">            <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">this</span>._anonymousTemplate;</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        }</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        set</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        {</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">            <span style="color: #0000ff;">this</span>._anonymousTemplate = <span style="color: #0000ff;">value</span>;</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        }</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    }</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">override</span> ControlCollection Controls</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    {</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        get</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        {</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">            <span style="color: #0000ff;">this</span>.EnsureChildControls();</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">            <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">base</span>.Controls;</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        }</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    }</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    [TemplateContainer(<span style="color: #0000ff;">typeof</span>(LoginView)), Browsable(<span style="color: #0000ff;">false</span>), DefaultValue((<span style="color: #0000ff;">string</span>)<span style="color: #0000ff;">null</span>), PersistenceMode(PersistenceMode.InnerProperty)]</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">virtual</span> ITemplate LoggedInTemplate</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    {</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        get</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        {</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">            <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">this</span>._loggedInTemplate;</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        }</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        set</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        {</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">            <span style="color: #0000ff;">this</span>._loggedInTemplate = <span style="color: #0000ff;">value</span>;</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        }</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    }</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">}</pre>
</div>
</div>
<h3>Step 3 &#8211; Creating a custom login control</h3>
<p>We also need to ensure that when the user logs in we call the SoftAuthentication.Login method. The easiest way to do this is to create a custom control that contains an ASP.NET login control and contains this call in the LoggedIn event. An example of how this can be done is shown below.</p>
<p>ASCX file:</p>
<div id="codeSnippetWrapper" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; width: 97.5%; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; cursor: text; border: silver 1px solid; padding: 4px;">
<div id="codeSnippet" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">asp:Login</span> <span style="color: #ff0000;">ID</span><span style="color: #0000ff;">="Login1"</span> <span style="color: #ff0000;">runat</span><span style="color: #0000ff;">="server"</span> <span style="color: #ff0000;">onloggedin</span><span style="color: #0000ff;">="Login1_LoggedIn"</span><span style="color: #0000ff;">&gt;</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">asp:Login</span><span style="color: #0000ff;">&gt;</span></pre>
</div>
</div>
<p>C# file:</p>
<div id="codeSnippetWrapper" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; width: 97.5%; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; cursor: text; border: silver 1px solid; padding: 4px;">
<div id="codeSnippet" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span style="color: #0000ff;">protected</span> <span style="color: #0000ff;">void</span> Login1_LoggedIn(<span style="color: #0000ff;">object</span> sender, EventArgs e)</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">{</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    MembershipUser user = Membership.GetUser(Login1.UserName);</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    SoftAuthentication.Login(user.UserName);</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">}</pre>
</div>
</div>
<h3>Step 4 – Creating a custom welcome control</h3>
<p>The next step is to create a custom welcome/login name control that displays the name of the logged in user, additional navigation links and a logout link. This control will call SoftAuthentication.LoginName to retrieve the logged in username, and SoftAuthentication.Logout when the user clicks the logout link. An example implementation is shown below.</p>
<p>ASCX file:</p>
<div id="codeSnippetWrapper" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; width: 97.5%; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; cursor: text; border: silver 1px solid; padding: 4px;">
<div id="codeSnippet" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">asp:Literal</span> <span style="color: #ff0000;">ID</span><span style="color: #0000ff;">="usernameText"</span> <span style="color: #ff0000;">runat</span><span style="color: #0000ff;">="server"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">asp:Literal</span><span style="color: #0000ff;">&gt;</span> |</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">a</span> <span style="color: #ff0000;">href</span><span style="color: #0000ff;">="/my-account/"</span><span style="color: #0000ff;">&gt;</span>My Account<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">a</span><span style="color: #0000ff;">&gt;</span> |</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">asp:LinkButton</span> <span style="color: #ff0000;">ID</span><span style="color: #0000ff;">="logoutLink"</span> <span style="color: #ff0000;">runat</span><span style="color: #0000ff;">="server"</span> <span style="color: #ff0000;">onclick</span><span style="color: #0000ff;">="logoutLink_Click"</span><span style="color: #0000ff;">&gt;</span>Logout<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">asp:LinkButton</span><span style="color: #0000ff;">&gt;</span></pre>
</div>
</div>
<p>C# file:</p>
<div id="codeSnippetWrapper" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; width: 97.5%; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; cursor: text; border: silver 1px solid; padding: 4px;">
<div id="codeSnippet" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span style="color: #0000ff;">protected</span> <span style="color: #0000ff;">override</span> <span style="color: #0000ff;">void</span> OnLoad(EventArgs e)</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">{</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #0000ff;">base</span>.OnLoad(e);</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #0000ff;">string</span> name = SoftAuthentication.LoginName;</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #0000ff;">if</span> (!<span style="color: #0000ff;">string</span>.IsNullOrEmpty(name))</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    {</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        usernameText.Text = <span style="color: #006080;">"Welcome "</span> + name;</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    }</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">}</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span style="color: #0000ff;">protected</span> <span style="color: #0000ff;">void</span> logoutLink_Click(<span style="color: #0000ff;">object</span> sender, EventArgs e)</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">{</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    SoftAuthentication.Logout();</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    FormsAuthentication.SignOut();</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    Response.Redirect(Request.Url.ToString(), <span style="color: #0000ff;">true</span>);</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">}</pre>
</div>
</div>
<h3>Step 5 – Adding controls to the masterpage</h3>
<p>Once our controls are in place we can add them to the masterpage as shown below:</p>
<div id="codeSnippetWrapper" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; width: 97.5%; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; cursor: text; border: silver 1px solid; padding: 4px;">
<div id="codeSnippet" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">SecureControls:SoftLoginView</span> <span style="color: #ff0000;">runat</span><span style="color: #0000ff;">="server"</span><span style="color: #0000ff;">&gt;</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">AnonymousTemplate</span><span style="color: #0000ff;">&gt;</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">LoginControls:SoftLogin</span> <span style="color: #ff0000;">id</span><span style="color: #0000ff;">="softLogin"</span> <span style="color: #ff0000;">runat</span><span style="color: #0000ff;">="server"</span><span style="color: #0000ff;">/&gt;</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">AnonymousTemplate</span><span style="color: #0000ff;">&gt;</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">LoggedInTemplate</span><span style="color: #0000ff;">&gt;</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">LoginControls:SoftWelcome</span> <span style="color: #ff0000;">id</span><span style="color: #0000ff;">="softWelcome"</span> <span style="color: #ff0000;">runat</span><span style="color: #0000ff;">="server"</span><span style="color: #0000ff;">/&gt;</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">LoggedInTemplate</span><span style="color: #0000ff;">&gt;</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">SecureControls:SoftLoginView</span><span style="color: #0000ff;">&gt;</span></pre>
</div>
</div>
<h3>Step 6 – Verifying the solution</h3>
<p>We now have a basic set of controls that will allow us to show information about the logged in user without having to send the authentication token over HTTP. Now when we log in we should see our username and links displayed as shown below even though we don’t send the authentication token over HTTP:</p>
<p><a href="http://www.sharepointconfig.com/wp-content/uploads/2010/04/sharepointhttpcustomwelcome.png"><img style="display: inline; border: 0px;" title="sharepoint-http-custom-welcome" src="http://www.sharepointconfig.com/wp-content/uploads/2010/04/sharepointhttpcustomwelcome_thumb.png" border="0" alt="sharepoint-http-custom-welcome" width="644" height="339" /></a></p>
<p>To verify that no sensitive data is being transmitted we can use a HTTP monitoring tool such as <a href="http://www.fiddler2.com">Fiddler</a> to see detailed requests as shown below (edited for clarity):</p>
<h3>1. Logon from the homepage</h3>
<p><strong>Request data:</strong></p>
<p><span style="color: #ff0000;"><strong>POST </strong></span><a href="https://www.company.com/Pages/default.aspx"><span style="color: #ff0000;"><strong>https://www.company.com/Pages/default.aspx</strong></span></a> HTTP/1.1<br />
Accept: application/x-ms-application, image/jpeg, application/xaml+xml, […]<br />
Referer: <a href="http://www.company.com/Pages/default.aspx">http://www.company.com/Pages/default.aspx</a><br />
Accept-Language: en-GB<br />
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; […]<br />
Content-Type: application/x-www-form-urlencoded<br />
Accept-Encoding: gzip, deflate<br />
Host: www.company.com<br />
Content-Length: 2856<br />
Connection: Keep-Alive<br />
Cache-Control: no-cache</p>
<p>__SPSCEditMenu=true<br />
&amp;MSOWebPartPage_PostbackSource=<br />
&amp;__REQUESTDIGEST=0xD1[…]<br />
&amp;__VIEWSTATE=%2F[…]<br />
&amp;ctl00%24ctl19%24softLogin%24Login1%24<span style="color: #ff0000;"><strong>UserName=spuser</strong></span><br />
&amp;ctl00%24ctl19%24softLogin%24Login1%24<span style="color: #ff0000;"><strong>Password=pass@word1</strong></span><br />
&amp;ctl00%24ctl19%24softLogin%24Login1%24LoginButton=Log+In</p>
<p>We can see that this was a POST request to send our login information including username and password to the server. We can also see that it was to a secure page (https) in the URL so this data is being safely transferred via SSL.</p>
<p><strong>Response data:</strong></p>
<p>HTTP/1.1 302 Found<br />
Cache-Control: private<br />
Content-Length: 28370<br />
Content-Type: text/html; charset=utf-8<br />
Location: /Pages/default.aspx<br />
Server: Microsoft-IIS/7.0<br />
X-AspNet-Version: 2.0.50727<br />
<span style="color: #ff0000;"><strong>Set-Cookie: .ASPXAUTH=43B75379C778EF78385E7025FF100925[..]; path=/; secure; HttpOnly</strong></span><br />
<strong>Set-Cookie: softAuth=spuser; path=/</strong><br />
X-Powered-By: ASP.NET<br />
Date: Wed, 07 Apr 2010 22:12:25 GMT</p>
<p>The response we get back over the SSL connection shows the server passing the .ASPXAUTH (forms authentication) and softAuth cookies back to the user. We can see that the forms authentication cookie now has the ‘secure’ attribute to ensure it is only sent over HTTPS (this is the result of the requireSSL setting). We can also see that our custom ‘softAuth’ cookie is sent back and does not have the ‘secure’ attribute that restricts it to HTTPS connections.</p>
<p>Note the HttpOnly attribute refers to whether the cookie is visible to client side script such as JavaScript.</p>
<h3>2. Subsequent HTTP requests</h3>
<p><strong>Request data:</strong></p>
<p><span style="color: #ff0000;"><strong>GET </strong></span><a href="http://www.company.com/Pages/default.aspx"><span style="color: #ff0000;"><strong>http://www.company.com/Pages/default.aspx</strong></span></a> HTTP/1.1<br />
Accept: application/x-ms-application, image/jpeg, application/xaml+xml, […]<br />
Connection: Keep-Alive<br />
Accept-Language: en-GB<br />
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; [..]<br />
Accept-Encoding: gzip, deflate<br />
Pragma: no-cache<br />
<span style="color: #ff0000;"><strong>Cookie: softAuth=spuser; </strong></span><br />
Cache-Control: no-cache<br />
Host: <a href="http://www.company.com">www.company.com</a></p>
<p>If we look at subsequent requests to HTTP pages we can see that the forms authentication cookie is no longer send for these unsecured requests. The only cookie sent is the ‘softAuth’ cookie that we use to display the username. If an attacker were to steal this information all they would be able to do is to see our username – as soon as they attempt to access a page secured via SSL the forms authentication would fail and they would simply be presented with the login page.</p>
    <div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/AriBakker?a=ZNf4hDL1fEI:YjsUYilfTQ0:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/AriBakker?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AriBakker?a=ZNf4hDL1fEI:YjsUYilfTQ0:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/AriBakker?i=ZNf4hDL1fEI:YjsUYilfTQ0:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AriBakker?a=ZNf4hDL1fEI:YjsUYilfTQ0:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/AriBakker?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AriBakker?a=ZNf4hDL1fEI:YjsUYilfTQ0:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/AriBakker?i=ZNf4hDL1fEI:YjsUYilfTQ0:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AriBakker?a=ZNf4hDL1fEI:YjsUYilfTQ0:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/AriBakker?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/AriBakker/~4/ZNf4hDL1fEI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sharepointconfig.com/2010/04/partial-ssl-sharepoint-sites-securing-the-authentication-cookie/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.sharepointconfig.com/2010/04/partial-ssl-sharepoint-sites-securing-the-authentication-cookie/</feedburner:origLink></item>
		<item>
		<title>Partial SSL SharePoint Sites – Login over HTTPS from HTTP pages</title>
		<link>http://feedproxy.google.com/~r/AriBakker/~3/z_D06dWTidY/</link>
		<comments>http://www.sharepointconfig.com/2010/04/partial-ssl-sharepoint-sites-login-over-http-from-http-pages/#comments</comments>
		<pubDate>Tue, 06 Apr 2010 21:31:28 +0000</pubDate>
		<dc:creator>Ari Bakker</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[HTTPS]]></category>
		<category><![CDATA[SSL]]></category>

		<guid isPermaLink="false">http://www.sharepointconfig.com/?p=625</guid>
		<description><![CDATA[This is the fourth in a <a href="http://www.sharepointconfig.com/tag/ssl/">series of posts</a> detailing how to configure a partially SSL secured SharePoint site. In the previous post we covered how to <a href="http://www.sharepointconfig.com/2010/03/enforcing-the-correct-protocol-for-partially-ssl-secured-sharepoint-sites/">secure the login page</a> so it is always delivered via SSL. This is fine for some pages but a common requirement for many public facing SharePoint sites is to have a login form that allows users to log in from any page. By default this is not secure as HTTP pages will send these details back via HTTP (i.e. in clear text), unless we configure the page to do otherwise. This post will cover how we can cater for this scenario without having to use SSL for the entire site. 
 
<img class="excerpt" src="http://www.sharepointconfig.com/wp-content/uploads/2010/04/sharepoint-login.png" alt="custom sharepoint login control"/>]]></description>
			<content:encoded><![CDATA[<p>This is the fourth in a <a href="http://www.sharepointconfig.com/tag/ssl/">series of posts</a> detailing how to configure a partially SSL secured SharePoint site. In the previous post we covered how to <a href="http://www.sharepointconfig.com/2010/03/enforcing-the-correct-protocol-for-partially-ssl-secured-sharepoint-sites/">secure the login page</a> so it is always delivered via SSL. This is fine for some pages but a common requirement for many public facing SharePoint sites is to have a login form that allows users to log in from any page. By default this is not secure as HTTP pages will send these details back via HTTP (i.e. in clear text), unless we configure the page to do otherwise. This post will cover how we can cater for this scenario without having to use SSL for the entire site.</p>
<p>Specifically we&#8217;ll have a look at how we can replace the SharePoint Welcome control with a custom control that meets the following requirements:</p>
<ul>
<li>Displays username and password fields in anonymous mode.</li>
<li>Allow us to login securely (via HTTPS) from a unsecured page (e.g. the homepage).</li>
<li>Display logged in username and &#8216;my account&#8217; type navigation links in logged in mode.</li>
</ul>
<p>The screen shot below shows what this will look like to anonymous users (note login form top right):</p>
<p><a href="http://www.sharepointconfig.com/wp-content/uploads/2010/04/sharepointmasterpageloginlayout.png"><img style="display: inline; border-width: 0px;" title="sharepoint site with login control on masterpage" src="http://www.sharepointconfig.com/wp-content/uploads/2010/04/sharepointmasterpageloginlayout_thumb.png" border="0" alt="sharepoint site with login control on masterpage" width="644" height="336" /></a></p>
<h3>Step 1 &#8211; Create a custom login control</h3>
<p>The first step to enable this scenario is to create a custom user control that shows us a login form to anonymous users, and a welcome message to authenticated users. We can do this really easily adding <a href="http://msdn.microsoft.com/en-us/library/ms178329.aspx">ASP.NET login controls</a> to our master page as shown below:</p>
<div id="codeSnippetWrapper" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; width: 97.5%; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; cursor: text; border: silver 1px solid; padding: 4px;">
<div id="codeSnippet" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">asp:LoginView</span> <span style="color: #ff0000;">ID</span><span style="color: #0000ff;">="LoginView1"</span> <span style="color: #ff0000;">runat</span><span style="color: #0000ff;">="server"</span><span style="color: #0000ff;">&gt;</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">AnonymousTemplate</span><span style="color: #0000ff;">&gt;</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">asp:Login</span> <span style="color: #ff0000;">ID</span><span style="color: #0000ff;">="Login1"</span> <span style="color: #ff0000;">runat</span><span style="color: #0000ff;">="server"</span><span style="color: #0000ff;">&gt;</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">asp:Login</span><span style="color: #0000ff;">&gt;</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">AnonymousTemplate</span><span style="color: #0000ff;">&gt;</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">LoggedInTemplate</span><span style="color: #0000ff;">&gt;</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        Welcome <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">asp:LoginName</span> <span style="color: #ff0000;">ID</span><span style="color: #0000ff;">="LoginName1"</span> <span style="color: #ff0000;">runat</span><span style="color: #0000ff;">="server"</span> <span style="color: #0000ff;">/&gt;</span> |</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">a</span> <span style="color: #ff0000;">href</span><span style="color: #0000ff;">="/my-account/"</span><span style="color: #0000ff;">&gt;</span>My Account<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">a</span><span style="color: #0000ff;">&gt;</span> |</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">asp:LoginStatus</span> <span style="color: #ff0000;">ID</span><span style="color: #0000ff;">="LoginStatus1"</span> <span style="color: #ff0000;">runat</span><span style="color: #0000ff;">="server"</span> <span style="color: #0000ff;">/&gt;</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">LoggedInTemplate</span><span style="color: #0000ff;">&gt;</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">asp:LoginView</span><span style="color: #0000ff;">&gt;</span></pre>
</div>
</div>
<p>The result for anonymous users using the default login template is shown below:</p>
<p><a href="http://www.sharepointconfig.com/wp-content/uploads/2010/04/sharepointmasterpagelogin.png"><img style="display: inline; border-width: 0px;" title="sharepoint site with asp.net login control on masterpage" src="http://www.sharepointconfig.com/wp-content/uploads/2010/04/sharepointmasterpagelogin_thumb.png" border="0" alt="sharepoint site with asp.net login control on masterpage" width="644" height="336" /></a></p>
<h3>Step 2 &#8211; Customise the login control layout</h3>
<p>We can then customise the layout by creating our own LayoutTemplate for the login control. A simple example is shown below:</p>
<div id="codeSnippetWrapper" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; width: 97.5%; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; cursor: text; border: silver 1px solid; padding: 4px;">
<div id="codeSnippet" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">asp:Login</span> <span style="color: #ff0000;">ID</span><span style="color: #0000ff;">="Login1"</span> <span style="color: #ff0000;">runat</span><span style="color: #0000ff;">="server"</span><span style="color: #0000ff;">&gt;</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">LayoutTemplate</span><span style="color: #0000ff;">&gt;</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">asp:TextBox</span> <span style="color: #ff0000;">ID</span><span style="color: #0000ff;">="UserName"</span> <span style="color: #ff0000;">Text</span><span style="color: #0000ff;">="username"</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        <span style="color: #ff0000;">runat</span><span style="color: #0000ff;">="server"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">asp:TextBox</span><span style="color: #0000ff;">&gt;</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">asp:RequiredFieldValidator</span> <span style="color: #ff0000;">ID</span><span style="color: #0000ff;">="UserNameRequired"</span> <span style="color: #ff0000;">runat</span><span style="color: #0000ff;">="server"</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">            <span style="color: #ff0000;">ControlToValidate</span><span style="color: #0000ff;">="UserName"</span> <span style="color: #ff0000;">ErrorMessage</span><span style="color: #0000ff;">="User Name is required."</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">            <span style="color: #ff0000;">ToolTip</span><span style="color: #0000ff;">="User Name is required."</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">            <span style="color: #ff0000;">ValidationGroup</span><span style="color: #0000ff;">="ctl00$ctl00$Login1"</span><span style="color: #0000ff;">&gt;</span>*<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">asp:RequiredFieldValidator</span><span style="color: #0000ff;">&gt;</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">asp:TextBox</span> <span style="color: #ff0000;">ID</span><span style="color: #0000ff;">="Password"</span> <span style="color: #ff0000;">Text</span><span style="color: #0000ff;">="password"</span> <span style="color: #ff0000;">TextMode</span><span style="color: #0000ff;">="Password"</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">            <span style="color: #ff0000;">runat</span><span style="color: #0000ff;">="server"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">asp:TextBox</span><span style="color: #0000ff;">&gt;</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">asp:RequiredFieldValidator</span> <span style="color: #ff0000;">ID</span><span style="color: #0000ff;">="PasswordRequired"</span> <span style="color: #ff0000;">runat</span><span style="color: #0000ff;">="server"</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">            <span style="color: #ff0000;">ControlToValidate</span><span style="color: #0000ff;">="Password"</span> <span style="color: #ff0000;">ErrorMessage</span><span style="color: #0000ff;">="Password is required."</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">            <span style="color: #ff0000;">ToolTip</span><span style="color: #0000ff;">="Password is required."</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">            <span style="color: #ff0000;">ValidationGroup</span><span style="color: #0000ff;">="ctl00$ctl00$Login1"</span><span style="color: #0000ff;">&gt;</span>*<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">asp:RequiredFieldValidator</span><span style="color: #0000ff;">&gt;</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">asp:Literal</span> <span style="color: #ff0000;">ID</span><span style="color: #0000ff;">="FailureText"</span> <span style="color: #ff0000;">runat</span><span style="color: #0000ff;">="server"</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">            <span style="color: #ff0000;">EnableViewState</span><span style="color: #0000ff;">="False"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">asp:Literal</span><span style="color: #0000ff;">&gt;</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">asp:Button</span> <span style="color: #ff0000;">ID</span><span style="color: #0000ff;">="LoginButton"</span> <span style="color: #ff0000;">runat</span><span style="color: #0000ff;">="server"</span> <span style="color: #ff0000;">CommandName</span><span style="color: #0000ff;">="Login"</span> <span style="color: #ff0000;">Text</span><span style="color: #0000ff;">="Log </span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">            In" <span style="color: #ff0000;">ValidationGroup</span><span style="color: #0000ff;">="ctl00$ctl00$Login1"</span> <span style="color: #0000ff;">/&gt;</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">LayoutTemplate</span><span style="color: #0000ff;">&gt;</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">asp:Login</span><span style="color: #0000ff;">&gt;</span></pre>
</div>
</div>
<p><a href="http://www.sharepointconfig.com/wp-content/uploads/2010/04/sharepointmasterpageloginlayout.png"><img style="display: inline; border-width: 0px;" title="sharepoint site with login control on masterpage" src="http://www.sharepointconfig.com/wp-content/uploads/2010/04/sharepointmasterpageloginlayout_thumb.png" border="0" alt="sharepoint site with login control on masterpage" width="644" height="336" /></a></p>
<p>At this point if we try and log on the browser is going to post the username and password back to the server using HTTP (i.e. back to the page we originally requested). We can verify this using a HTTP monitoring tool such as <a href="http://www.fiddler2.com/">Fiddler</a> as shown below:</p>
<p><a href="http://www.sharepointconfig.com/wp-content/uploads/2010/04/fiddlerhttppost.png"><img style="display: inline; border: 0px;" title="fiddler-http-post" src="http://www.sharepointconfig.com/wp-content/uploads/2010/04/fiddlerhttppost_thumb.png" border="0" alt="fiddler-http-post" width="632" height="484" /></a></p>
<p>This shows us that the request is over <strong>HTTP</strong> and is a <strong>POST</strong> request so is sending data. We can see the <strong>username and password</strong> and since this is not over SSL it is sent in <strong>clear text</strong>. We also see that the <strong>authentication cookie </strong>is sent back also over <strong>HTTP</strong> (i.e. the Set-Cookie statement).</p>
<h3>Step 3 &#8211; Configure the login control to send data securely</h3>
<p>If we don’t want to place the homepage under HTTPS we need to configure the sending (i.e. the HTTP POST) to use SSL. The easiest way to do this is in ASP.NET is to set the PostBackUrl of the Login form to be an absolute URL to the secure version of the current page.</p>
<p>To do this in the code behind file for our login control we can add the following:</p>
<div id="codeSnippetWrapper" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; width: 97.5%; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; cursor: text; border: silver 1px solid; padding: 4px;">
<div id="codeSnippet" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span style="color: #0000ff;">protected</span> <span style="color: #0000ff;">void</span> Page_Load(<span style="color: #0000ff;">object</span> sender, EventArgs e)</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">{</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #008000;">// ensure we send credentials over a secure connection</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #0000ff;">if</span>(!HttpContext.Current.Request.IsSecureConnection)</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    {</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        <span style="color: #0000ff;">string</span> postbackUrl = HttpContext.Current.Request.Url.AbsoluteUri.Replace(<span style="color: #006080;">"http"</span>, <span style="color: #006080;">"https"</span>);</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        Button loginBtn = (Button)Login1.FindControl(<span style="color: #006080;">"LoginButton"</span>);</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        loginBtn.PostBackUrl = postbackUrl;</pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    }</pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">}</pre>
</div>
</div>
<p>This code checks whether we are already on an HTTPS page and if so no action is required. If we are not on an SSL page the code finds the LoginButton and sets the PostBackUrl property to the HTTPS version of the current page.</p>
<h3>Step 4 &#8211; Update redirect rules</h3>
<p>Additionally we need to allow our SSL redirection module to allow POST requests over HTTPS to all pages on the site. If  you followed the example in the previous post to configure this using the IIS Url Rewrite module you will need to edit the HTTPS to HTTP rule by adding the following condition:</p>
<ul>
<li><strong>Condition input</strong>: {REQUEST_METHOD}</li>
<li><strong>Check if input string</strong>: Matches the pattern</li>
<li><strong>Pattern</strong>: GET</li>
</ul>
<p><a href="http://www.sharepointconfig.com/wp-content/uploads/2010/04/iisurlrewriteconditionrequestmethod.png"><img style="display: inline; border: 0px;" title="iis-url-rewrite-condition-request-method" src="http://www.sharepointconfig.com/wp-content/uploads/2010/04/iisurlrewriteconditionrequestmethod_thumb.png" border="0" alt="iis-url-rewrite-condition-request-method" width="417" height="277" /></a></p>
<p>This updates the rule that redirects HTTPS requests to HTTP so that it only applies to GET requests (i.e. POST requests will be allowed via HTTPS). Now when we click the ‘Log In’ button shown below from an HTTP page our details are sent via SSL.</p>
<p><a href="http://www.sharepointconfig.com/wp-content/uploads/2010/04/sharepointmasterpageloginhttphttps.png"><img style="display: inline; border-width: 0px;" title="https login from http page in sharepoint" src="http://www.sharepointconfig.com/wp-content/uploads/2010/04/sharepointmasterpageloginhttphttps_thumb.png" border="0" alt="https login from http page in sharepoint" width="644" height="336" /></a></p>
<h3>Step 5 &#8211; Verify the login credentials are sent via HTTPS</h3>
<p>We can verify this by using a tool such as Fiddler to inspect the individual requests.</p>
<p><a href="http://www.sharepointconfig.com/wp-content/uploads/2010/04/fiddlersharepointhttploginhttps.png"><img style="display: inline; border-width: 0px;" title="fiddler-sharepoint-http-login-https" src="http://www.sharepointconfig.com/wp-content/uploads/2010/04/fiddlersharepointhttploginhttps_thumb.png" border="0" alt="fiddler-sharepoint-http-login-https" width="644" height="479" /></a></p>
<p>The above diagram shows:</p>
<ul>
<li>The HTTP GET request to the homepage (request number 1 top left)</li>
<li>The HTTPS POST request to the homepage (top left and right highlights)
<ul>
<li>Inside the HTTPS POST we can see our username and password. As this is part of an HTTPS request we know this information is encrypted.</li>
</ul>
</li>
<li>The HTTPS response from the server (bottom right)
<ul>
<li>Inside the HTTPS response we see the Set-Cookie statement. Again as this is an HTTPS request we know this cookie is secure.</li>
</ul>
</li>
</ul>
<p>Another way to verify that the authentication was completed over a secure channel is to set the ‘requireSSL’ attribute of the ‘forms’ element in the web.config to true as shown below:</p>
<div id="codeSnippetWrapper" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; width: 97.5%; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; cursor: text; border: silver 1px solid; padding: 4px;">
<div id="codeSnippet" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">authentication</span> <span style="color: #ff0000;">mode</span><span style="color: #0000ff;">="Forms"</span><span style="color: #0000ff;">&gt;</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">forms</span> <span style="color: #ff0000;">loginUrl</span><span style="color: #0000ff;">="https://www.company.com/pages/login.aspx"</span> <span style="color: #ff0000;">requireSSL</span><span style="color: #0000ff;">="true"</span> <span style="color: #0000ff;">/&gt;</span></pre>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">authentication</span><span style="color: #0000ff;">&gt;</span></pre>
</div>
</div>
<p>This specifies that the authentication cookie should only be sent via SSL. If we had tried to login from an unsecured (HTTP) page, this would have given us the following error as it would have been trying to create the authentication cookie over an unsecure channel:</p>
<p>&#8220;The application is configured to issue secure cookies. These cookies require the browser to issue the request over SSL (https protocol). However, the current request is not over SSL.&#8221;</p>
<p>Since we have configured the authentication request to be over SSL, however, this will not occur and we can be sure our login credentials are secured. There are some other implications of requiring the authentication cookie to only be transferred via SSL we will cover in the following posts.</p>
    <div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/AriBakker?a=z_D06dWTidY:wc1oW1crN4w:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/AriBakker?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AriBakker?a=z_D06dWTidY:wc1oW1crN4w:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/AriBakker?i=z_D06dWTidY:wc1oW1crN4w:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AriBakker?a=z_D06dWTidY:wc1oW1crN4w:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/AriBakker?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AriBakker?a=z_D06dWTidY:wc1oW1crN4w:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/AriBakker?i=z_D06dWTidY:wc1oW1crN4w:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AriBakker?a=z_D06dWTidY:wc1oW1crN4w:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/AriBakker?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/AriBakker/~4/z_D06dWTidY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sharepointconfig.com/2010/04/partial-ssl-sharepoint-sites-login-over-http-from-http-pages/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.sharepointconfig.com/2010/04/partial-ssl-sharepoint-sites-login-over-http-from-http-pages/</feedburner:origLink></item>
		<item>
		<title>Enforcing the correct protocol for partially SSL secured SharePoint sites</title>
		<link>http://feedproxy.google.com/~r/AriBakker/~3/76Ho80_2q5s/</link>
		<comments>http://www.sharepointconfig.com/2010/03/enforcing-the-correct-protocol-for-partially-ssl-secured-sharepoint-sites/#comments</comments>
		<pubDate>Thu, 18 Mar 2010 08:14:52 +0000</pubDate>
		<dc:creator>Ari Bakker</dc:creator>
				<category><![CDATA[Configuration]]></category>
		<category><![CDATA[Infrastructure]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[HTTPS]]></category>
		<category><![CDATA[IIS]]></category>
		<category><![CDATA[SSL]]></category>

		<guid isPermaLink="false">http://www.sharepointconfig.com/?p=592</guid>
		<description><![CDATA[This is the third in a <a href="http://www.sharepointconfig.com/tag/ssl/">series of posts</a> detailing <a href="http://www.sharepointconfig.com/2010/03/securing-mixed-ssl-sites-in-sharepoint/">how to configure a partially SSL secured SharePoint site</a>. In the previous post we covered how to enable SSL for the site. In this post we will cover how to force connections to use the correct protocol (HTTPS for sensitive data, HTTP otherwise). This is required so that if a user tries to browse to page that sends or displays sensitive data via HTTP (e.g. <strong>http</strong>://www.company.com/pages/login.aspx) they will be redirected to the HTTPS version of the page (e.g. <strong>https</strong>://www.company.com/pages/login.aspx – so they can login securely) and vice versa for pages like the homepage that should be delivered via HTTP so they do not incur the performance hit of encrypting and decrypting the page. 

<img class="excerpt" src="http://www.sharepointconfig.com/wp-content/uploads/2010/03/signpost-direction.jpg" alt="signpost directions" />

<div xmlns:cc="http://creativecommons.org/ns#" about="http://www.flickr.com/photos/nord_modular/52772616/"><p>Photo by <a rel="cc:attributionURL" href="http://www.flickr.com/photos/nord_modular/52772616/">nord_modular</a> / <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/2.0/">CC BY-NC-SA 2.0</a></p></div>]]></description>
			<content:encoded><![CDATA[<p>This is the third in a <a href="http://www.sharepointconfig.com/tag/ssl/">series of posts</a> detailing <a href="http://www.sharepointconfig.com/2010/03/securing-mixed-ssl-sites-in-sharepoint/">how to configure a partially SSL secured SharePoint site</a>. In the previous post we covered how to enable SSL for the site. In this post we will cover how to force connections to use the correct protocol (HTTPS for sensitive data, HTTP otherwise). This is required so that if a user tries to browse to page that sends or displays sensitive data via HTTP (e.g. <strong>http</strong>://www.company.com/pages/login.aspx) they will be redirected to the HTTPS version of the page (e.g. <strong>https</strong>://www.company.com/pages/login.aspx – so they can login securely) and vice versa for pages like the homepage that should be delivered via HTTP so they do not incur the performance hit of encrypting and decrypting the page.</p>
<p>Ideally we would enter absolute links when linking to HTTPS pages from HTTP pages and vice versa. In reality, however, there are several reasons why this won’t always work so we need to have a ‘catch all’ method to ensure the correct protocol is used. Some reasons absolute URL’s don’t always work are:</p>
<ul>
<li>OOTB web parts such as the summary links web part will convert absolute links to relative links if they find an alternate access mapping for the site entered.</li>
<li>Content authors may enter relative URL’s to secure pages such as the login page, for example by using the link selector tool.</li>
<li>Content deployment will automatically replace absolute URL’s with relative URL’s if an alternate access mapping exists for the absolute URL. This affects all content pages and many OOTB web parts.</li>
</ul>
<p>One way to ensure the correct protocol is used is to use redirection at the IIS level (this can also be done at the firewall but this won&#8217;t often be available for development/test environments). With the release of IIS 7 Microsoft has developed a <a href="http://www.iis.net/expand/URLRewrite">URL Rewrite Module</a> that provides an easy way for us to do this in IIS 7 Manager. The following steps show how to set this up.</p>
<h3>Site setup</h3>
<p>In this example we will partition the site into three areas.</p>
<ul>
<li><strong>Secured</strong> <strong>and anonymous</strong> – pages that display or send sensitive information and therefore require SSL but are available to anonymous users. For example the login page would fit into this category.</li>
<li><strong>Secured and authenticated</strong> – page that display or send sensitive information and require the user to be logged in. For example a &#8216;My Details&#8217; page that allows the user to view and edit their address details.</li>
<li><strong>Unsecured</strong> – pages that do not require the user to be logged in and do not contain sensitive information. All the remaining pages in the site fall into this category.</li>
</ul>
<p>This is shown in the diagram below:</p>
<p><a href="http://www.sharepointconfig.com/wp-content/uploads/2010/03/clip_image0021.jpg"><img style="display: inline; border: 0px initial initial;" title="clip_image002" src="http://www.sharepointconfig.com/wp-content/uploads/2010/03/ssl-sitemap1.png" border="0" alt="clip_image002" width="606" height="208" /></a></p>
<p>The site map above shows; an unsecured, anonymous homepage and ‘Press Releases’ site, a SSL secured and anonymous login page, and a SSL Secured ‘My Account’ site that requires authentication to access.</p>
<h3>Enforcing SSL for anonymously accessible SharePoint pages</h3>
<h4>Step 1. Redirect login requests to the login form</h4>
<p>As we are creating a public website we’ll replace the standard SharePoint branded login page with a publishing page that reflects our look and feel. In this example I’m using the <a href="http://cks.codeplex.com/releases/view/17901">Community Kit for SharePoint: Forms Based Authentication</a> (CKS:FBA) solution&#8217;s web parts to allow me to quickly create some pages with the ASP.NET login controls packaged up as web parts. So to create the login page I’ve just created a page based on the Welcome Page template and dropped in the CKS:FBA Login web part as shown below:</p>
<p><a href="http://www.sharepointconfig.com/wp-content/uploads/2010/03/clip_image004.jpg"><img style="display: inline; border-width: 0px;" title="clip_image004" src="http://www.sharepointconfig.com/wp-content/uploads/2010/03/clip_image004_thumb.jpg" border="0" alt="clip_image004" width="606" height="432" /></a></p>
<p>We can then specify this as the login page by changing the loginUrl attribute of the forms element in the web.config as shown below:</p>
<p><code>&lt;authentication mode="Forms"&gt;</code></p>
<p><code> </code></p>
<p><code>&lt;forms loginUrl="https://www.company.com/pages/login.aspx"/&gt;</code></p>
<p><code> </code></p>
<p><code>&lt;/authentication&gt;</code></p>
<p>This will now redirect us to the login page (using SSL) if we try to access a secured resource.</p>
<h4>Step 2. Secure the login page</h4>
<p>While requests to secure pages will now be redirected to the login form it is still possible to view the page via HTTP so we need to apply some additional logic to ensure that if the user clicks on a link to the HTTP version of the page or types the HTTP URL into the browsers address bar the page is served via HTTPS. In this example we will use the <a href="http://www.iis.net/expand/URLRewrite">URL Rewrite Module for IIS 7</a> but if your firewall supports it that might be a better solution. If you are using an earlier version of IIS you might need to look into third party rewrite tools or create a custom solution either using ISAPI or an HttpModule to do the redirection.</p>
<p>Once you have the URL Rewrite Module installed you should see the feature show up for your site in IIS.</p>
<p><a href="http://www.sharepointconfig.com/wp-content/uploads/2010/03/clip_image006.gif"><img style="display: inline; border-width: 0px;" title="clip_image006" src="http://www.sharepointconfig.com/wp-content/uploads/2010/03/clip_image006_thumb.gif" border="0" alt="clip_image006" width="606" height="466" /></a></p>
<p>To secure the login page open up the feature and click ‘Add Rules&#8230;’ and select the ‘Blank rule’ template</p>
<p><a href="http://www.sharepointconfig.com/wp-content/uploads/2010/03/clip_image008.gif"><img style="display: inline; border-width: 0px;" title="clip_image008" src="http://www.sharepointconfig.com/wp-content/uploads/2010/03/clip_image008_thumb.gif" border="0" alt="clip_image008" width="606" height="466" /></a></p>
<p>Enter the following information to redirect HTTP requests to the login page to use HTTPS</p>
<ul>
<li><strong>Name:</strong> HTTP to HTTPS</li>
<li><strong>Pattern</strong>: ^Pages/Login\.aspx</li>
<li><strong>Condition</strong>:</li>
<li><strong>Condition input</strong>: {HTTPS}</li>
<li><strong>Check if input string</strong>: Matches the pattern</li>
<li><strong>Pattern</strong>: off</li>
<li><strong>Action Type</strong>: Redirect</li>
<li><strong>Redirect URL</strong>: https://{HTTP_HOST}/{R:0}</li>
<li><strong>Redirect type</strong>: Permanent (301)</li>
</ul>
<p>Note: detailed information on creating rewrite rules is covered in the article &#8220;<a href="http://learn.iis.net/page.aspx/461/creating-rewrite-rules-for-the-url-rewrite-module/">Creating rewrite rules for the URL Rewrite Module</a>&#8221; on the Official IIS Site.</p>
<p><a href="http://www.sharepointconfig.com/wp-content/uploads/2010/03/clip_image010.gif"><img style="display: inline; border-width: 0px;" title="clip_image010" src="http://www.sharepointconfig.com/wp-content/uploads/2010/03/clip_image010_thumb.gif" border="0" alt="clip_image010" width="606" height="642" /></a></p>
<p>Now if we type in <strong>http</strong>://www.company.com/pages/login.aspx we will automatically be redirected to <strong>https</strong>://www.company.com/pages/login.aspx.</p>
<p><a href="http://www.sharepointconfig.com/wp-content/uploads/2010/03/clip_image012.jpg"><img style="display: inline; border-width: 0px;" title="clip_image012" src="http://www.sharepointconfig.com/wp-content/uploads/2010/03/clip_image012_thumb.jpg" border="0" alt="clip_image012" width="605" height="427" /></a></p>
<h4>Step 3. Enable authentication</h4>
<p>We can extend this approach slightly to secure pages that should be delivered via SSL and only visible to authenticated users. Examples of these types of pages are ‘My Account’ type pages that allow logged in users to edit their personal information and/or view purchase history. In this example we will create a site called ‘My Account’ and create an example ‘Change Password’ page to show how we can control access to these pages and ensure the correct protocol is used.</p>
<p>Remove anonymous access for site</p>
<p>The first step in the process is to log into the forms authenticated site as a user who has administrative privileges. This can be done by specifying a forms user as the site collection administrator in Central Administration or by <a href="http://msdn.microsoft.com/en-us/library/bb975136.aspx#MOSS2007FBAPart1_grantpolicy">granting them the full rights policy</a>.</p>
<p>1. Once you have logged in you will need to browse to the &#8216;My Account&#8217; site and navigate to <strong>Site Actions &gt; Site Settings &gt; Modify All Site Settings &gt; Users and Permissions | Advanced permissions</strong>.</p>
<p>2. Select <strong>Actions &gt; Edit Permissions. </strong>This will break permissions inheritance and allow us to remove anonymous access to the &#8216;My Account&#8217; site.</p>
<p><a href="http://www.sharepointconfig.com/wp-content/uploads/2010/03/clip_image014.jpg"><img style="display: inline; border-width: 0px;" title="clip_image014" src="http://www.sharepointconfig.com/wp-content/uploads/2010/03/clip_image014_thumb.jpg" border="0" alt="clip_image014" width="606" height="432" /></a></p>
<p><strong>3. </strong><strong>Select Settings &gt; Anonymous Access</strong></p>
<p><strong><a href="http://www.sharepointconfig.com/wp-content/uploads/2010/03/clip_image016.gif"><img style="display: inline; border-width: 0px;" title="clip_image016" src="http://www.sharepointconfig.com/wp-content/uploads/2010/03/clip_image016_thumb.gif" border="0" alt="clip_image016" width="606" height="432" /></a></strong></p>
<p>4. Select <strong>&#8216;Nothing&#8217;</strong> and click <strong>OK</strong>.</p>
<p><strong><a href="http://www.sharepointconfig.com/wp-content/uploads/2010/03/clip_image018.gif"><img style="display: inline; border-width: 0px;" title="clip_image018" src="http://www.sharepointconfig.com/wp-content/uploads/2010/03/clip_image018_thumb.gif" border="0" alt="clip_image018" width="606" height="432" /></a></strong></p>
<p>Anonymous users trying to access this site will now be redirected to the login page to authenticate before being able to view pages in this site. We now need to add forms users or roles to one of the groups that does have access to the site to allow them to view these pages. In this example I have created a role in the forms database named &#8216;AllUsers&#8217; and assigned every user this permission. To give all users read only permission on the &#8216;My Account&#8217; site we will add the &#8216;AllUsers&#8217; role to the &#8216;Restricted Readers&#8217; group in SharePoint.</p>
<p>5. Navigate to <strong>Site Settings &gt; Modify All Site Settings &gt; People and Groups </strong>and<strong> </strong>select the &#8216;<strong>Restricted Readers</strong>&#8216; group.</p>
<p>6. Enter the &#8216;AllUsers&#8217; group into the people picker and select &#8216;OK&#8217;</p>
<p><a href="http://www.sharepointconfig.com/wp-content/uploads/2010/03/clip_image020.gif"><img style="display: inline; border-width: 0px;" title="clip_image020" src="http://www.sharepointconfig.com/wp-content/uploads/2010/03/clip_image020_thumb.gif" border="0" alt="clip_image020" width="606" height="432" /></a></p>
<p>We now have the correct permissions applied. To check that anonymous users can no longer access this site we can try to browse to the site directly as an anonymous user:</p>
<p><a href="http://www.sharepointconfig.com/wp-content/uploads/2010/03/clip_image022.jpg"><img style="display: inline; border-width: 0px;" title="clip_image022" src="http://www.sharepointconfig.com/wp-content/uploads/2010/03/clip_image022_thumb.jpg" border="0" alt="clip_image022" width="606" height="59" /></a></p>
<p>As we don’t have permission ASP.NET will redirect us to the login page specified in the web.config file:</p>
<p><a href="http://www.sharepointconfig.com/wp-content/uploads/2010/03/clip_image024.jpg"><img style="display: inline; border-width: 0px;" title="clip_image024" src="http://www.sharepointconfig.com/wp-content/uploads/2010/03/clip_image024_thumb.jpg" border="0" alt="clip_image024" width="605" height="426" /></a></p>
<h4>Step 4. Secure additional sites</h4>
<p>While the ‘My Account’ site is now restricted to anonymous users the pages within this site are not forced to use SSL. To do this we need to modify our rewrite rule as follows:</p>
<p>1. In IIS manager open the URL Rewrite feature</p>
<p><a href="http://www.sharepointconfig.com/wp-content/uploads/2010/03/clip_image0061.gif"><img style="display: inline; border-width: 0px;" title="clip_image006[1]" src="http://www.sharepointconfig.com/wp-content/uploads/2010/03/clip_image0061_thumb.gif" border="0" alt="clip_image006[1]" width="606" height="466" /></a></p>
<p>2. Select the rule we created to secure the login page and click ‘Edit’</p>
<p><a href="http://www.sharepointconfig.com/wp-content/uploads/2010/03/clip_image026.jpg"><img style="display: inline; border-width: 0px;" title="clip_image026" src="http://www.sharepointconfig.com/wp-content/uploads/2010/03/clip_image026_thumb.jpg" border="0" alt="clip_image026" width="606" height="359" /></a></p>
<p>3. Update the pattern to the following to additionally redirect HTTP requests to the ‘My Account’ site to use HTTPS:</p>
<ul>
<li><strong>Pattern</strong>: ^(my-account|pages/login)(.*)\.aspx</li>
</ul>
<h4><a href="http://www.sharepointconfig.com/wp-content/uploads/2010/03/clip_image028.gif"><img style="display: inline; border-width: 0px;" title="clip_image028" src="http://www.sharepointconfig.com/wp-content/uploads/2010/03/clip_image028_thumb.gif" border="0" alt="clip_image028" width="606" height="276" /></a></h4>
<p>This will ensure any requests to the ‘My Account’ site are also sent via SSL.</p>
<h4>Step 5. Ensure non-sensitive pages are delivered via HTTP.</h4>
<p>The last step is to force non-sensitive pages such as the homepage to use HTTP to avoid the overhead of encrypting and decrypting the page. This can be done by creating an additional rewrite rule as shown below:</p>
<p>1. In IIS manager open the URL Rewrite feature and click ‘Add Rules&#8230;’ and select the ‘Blank rule’ template</p>
<p><a href="http://www.sharepointconfig.com/wp-content/uploads/2010/03/clip_image029.gif"><img style="display: inline; border-width: 0px;" title="clip_image029" src="http://www.sharepointconfig.com/wp-content/uploads/2010/03/clip_image029_thumb.gif" border="0" alt="clip_image029" width="606" height="466" /></a></p>
<p>Enter the following information to redirect HTTPS requests to use HTTP for all other pages:</p>
<ul>
<li><strong>Name:</strong> HTTPS to HTTP</li>
<li><strong>Pattern</strong>: ^(?!my-account|pages/login)(.*)\.aspx</li>
<li><strong>Condition</strong>:</li>
<li><strong>Condition input</strong>: {HTTPS}</li>
<li><strong>Check if input string</strong>: Matches the pattern</li>
<li><strong>Pattern</strong>: on</li>
<li><strong>Action Type</strong>: Redirect</li>
<li><strong>Redirect URL</strong>: http://{HTTP_HOST}/{R:0}</li>
<li><strong>Redirect type</strong>: Permanent (301)</li>
</ul>
<p>Note the pattern above is a regular expression that matches any URL&#8217;s that do not start with &#8216;my-account&#8217; or &#8216;pages/login&#8217;.</p>
<p><a href="http://www.sharepointconfig.com/wp-content/uploads/2010/03/clip_image031.gif"><img style="display: inline; border-width: 0px;" title="clip_image031" src="http://www.sharepointconfig.com/wp-content/uploads/2010/03/clip_image031_thumb.gif" border="0" alt="clip_image031" width="597" height="809" /></a></p>
<p>These rules will now ensure that all pages within the site use the correct protocol (HTTPS for pages that need to be secured, and HTTP for all other pages on the site):</p>
<p><a href="http://www.sharepointconfig.com/wp-content/uploads/2010/03/clip_image033.jpg"><img style="display: inline; border-width: 0px;" title="clip_image033" src="http://www.sharepointconfig.com/wp-content/uploads/2010/03/clip_image033_thumb.jpg" border="0" alt="clip_image033" width="605" height="158" /></a></p>
<p>Now if we try to navigate to the SSL version of a page that does not require SSL we will be redirected to the page using HTTP. For example if we enter https://www.company.com into the browsers address bar we will be redirected to http://www.company.com:</p>
<p><a href="http://www.sharepointconfig.com/wp-content/uploads/2010/03/clip_image035.jpg"><img style="display: inline; border-width: 0px;" title="clip_image035" src="http://www.sharepointconfig.com/wp-content/uploads/2010/03/clip_image035_thumb.jpg" border="0" alt="clip_image035" width="606" height="59" /></a></p>
<p><a href="http://www.sharepointconfig.com/wp-content/uploads/2010/03/clip_image037.gif"><img style="display: inline; border-width: 0px;" title="clip_image037" src="http://www.sharepointconfig.com/wp-content/uploads/2010/03/clip_image037_thumb.gif" border="0" alt="clip_image037" width="606" height="426" /></a></p>
<p>We have successfully secured the contents of the page but there is still a gaping hole in our security: the authentication token is sent via HTTP. This means that if we log in and then navigate to a unsecured page (e.g. the homepage) we will be sending our authentication information in the clear (i.e. the .ASPXAUTH cookie I mentioned in the <a href="http://www.sharepointconfig.com/2010/03/securing-mixed-ssl-sites-in-sharepoint/">Securing mixed SSL sites in SharePoint</a> post). In the following article I’ll look at what we need to consider when forcing the authentication token to only be sent via HTTPS.</p>
    <div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/AriBakker?a=76Ho80_2q5s:wM-KuMMd8u4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/AriBakker?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AriBakker?a=76Ho80_2q5s:wM-KuMMd8u4:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/AriBakker?i=76Ho80_2q5s:wM-KuMMd8u4:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AriBakker?a=76Ho80_2q5s:wM-KuMMd8u4:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/AriBakker?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AriBakker?a=76Ho80_2q5s:wM-KuMMd8u4:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/AriBakker?i=76Ho80_2q5s:wM-KuMMd8u4:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AriBakker?a=76Ho80_2q5s:wM-KuMMd8u4:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/AriBakker?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/AriBakker/~4/76Ho80_2q5s" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sharepointconfig.com/2010/03/enforcing-the-correct-protocol-for-partially-ssl-secured-sharepoint-sites/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.sharepointconfig.com/2010/03/enforcing-the-correct-protocol-for-partially-ssl-secured-sharepoint-sites/</feedburner:origLink></item>
	</channel>
</rss>
