<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	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:creativeCommons="http://backend.userland.com/creativeCommonsRssModule"
>

<channel>
	<title>From the Desk of Brandon Haynes &#187; Technology</title>
	<atom:link href="http://blogs.law.harvard.edu/brandonhaynes/category/technology/feed/" rel="self" type="application/rss+xml" />
	<link>http://blogs.law.harvard.edu/brandonhaynes</link>
	<description>Observations about the intersection of technology, business, and intellectual property</description>
	<lastBuildDate>Wed, 21 Oct 2009 16:14:28 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<creativeCommons:license>http://creativecommons.org/licenses/by-sa/3.0/us/</creativeCommons:license>
		<item>
		<title>Preview: DotNetNuke Control Panel Module Grouping</title>
		<link>http://blogs.law.harvard.edu/brandonhaynes/2009/10/20/preview-dotnetnuke-module-containers/</link>
		<comments>http://blogs.law.harvard.edu/brandonhaynes/2009/10/20/preview-dotnetnuke-module-containers/#comments</comments>
		<pubDate>Tue, 20 Oct 2009 14:07:17 +0000</pubDate>
		<dc:creator>Brandon Haynes</dc:creator>
				<category><![CDATA[DotNetNuke (DNN) Content Management System]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[DotNetNuke]]></category>
		<category><![CDATA[DotNetNuke Integration]]></category>
		<category><![CDATA[User Interface]]></category>

		<guid isPermaLink="false">http://blogs.law.harvard.edu/brandonhaynes/?p=336</guid>
		<description><![CDATA[After lingering in limbo for some time, I am pleased to be able to provide some screenshots of my upcoming DotNetNuke Module Container project.  This project is expected to be released into beta sometime in mid-November, though I may circulate to a few interested parties before any public release.
The project is designed to address a [...]]]></description>
			<content:encoded><![CDATA[<p>After lingering in limbo for some time, I am pleased to be able to provide some screenshots of my upcoming DotNetNuke Module Container project.  This project is expected to be released into beta sometime in mid-November, though I may circulate to a few interested parties before any public release.</p>
<p>The project is designed to address a common usability concern with the default DotNetNuke control panel, which is perhaps best illustrated pictorially:</p>
<div style="background-color: #eee;border: solid #777 1px;width: 300px;margin-left: 6em;padding: 6px">
<div id="attachment_335" class="wp-caption aligncenter" style="width: 310px"><a href="http://blogs.law.harvard.edu/brandonhaynes/files/2009/10/Scary-Menu.png" rel="lightbox[336]"><img src="http://blogs.law.harvard.edu/brandonhaynes/files/2009/10/Scary-Menu.png" alt="A Scary DotNetNuke Menu with Many, Many Options" width="300" height="236" /></a><p class="wp-caption-text">A Scary DotNetNuke Menu with Many, Many Options</p></div>
</div>
<p>As users of the framework have surely noted, the list of modules available to an administrator is lengthy and highly-confounding.  While experience mitigates this difficulty, it remains a significant challenge for new administrators to understand which module to select from this imposing list.</p>
<p>This project attempts to group this set of modules into manageable containers where each module is grouped by function (e.g. administrative modules, e-commerce modules).  By way of example, a clean DotNetNuke 5.1.4 install with ALL core modules installed (and grouped into logical containers) would be reduced to a very understandable list:</p>
<div style="background-color: #eee;border: solid #777 1px;width: 468px">
<div id="attachment_333" class="wp-caption aligncenter" style="width: 478px"><a href="http://blogs.law.harvard.edu/brandonhaynes/files/2009/10/ControlPanel.Minimized.png" rel="lightbox[336]"><img class="size-full wp-image-333" src="http://blogs.law.harvard.edu/brandonhaynes/files/2009/10/ControlPanel.Minimized.png" alt="A compact, minimized DotNetNuke control panel module list with groups by function." width="468" height="170" /></a><p class="wp-caption-text">A compact, minimized DotNetNuke control panel module list with groups by function.  Note that the image above continues to utilize the default DotNetNuke control panel; the containers do not require any adjustment to that component.</p></div>
</div>
<p>After a container is selected and instantiated, a user is prompted to select from one of the modules contained therein:</p>
<div style="background-color: #eee;border: solid #777 1px;width: 468px">
<div id="attachment_334" class="wp-caption aligncenter" style="width: 478px"><a href="http://blogs.law.harvard.edu/brandonhaynes/files/2009/10/Interactive-Modules.png" rel="lightbox[336]"><img class="size-full wp-image-334 " src="http://blogs.law.harvard.edu/brandonhaynes/files/2009/10/Interactive-Modules.Focus.png" alt="Interactive selection of a module within a grouping after selecting the group from the control panel." width="468" height="299" /></a><p class="wp-caption-text">Interactive selection of a module within a grouping after selecting the group from the control panel.</p></div>
</div>
<p>The selection process utilizes jQuery, minimizes the number of post-backs, and (in my opinion) greatly increases overall usability.</p>
<p>This module is expected to be released sometime in mid-to-late November for public consumption.  A limited beta may be made available prior to this date, subject to interest.</p>
<p>Your feedback is appreciated.  Does the lengthy DotNetNuke module list bother you?  Would you (or your administrators) find a solution of the type outlined above useful?  Please leave a comment and share your thoughts.</p>
<p>B</p>
<p><span id="more-336"></span>Some additional screenshots:</p>
<div style="background-color: #eee;border: solid #777 1px;width: 468px;padding: 6px;margin-bottom: 1em">
<p><a href="http://blogs.law.harvard.edu/brandonhaynes/files/2009/10/AdministrativeModules.png" rel="lightbox[336]"><img src="http://blogs.law.harvard.edu/brandonhaynes/files/2009/10/AdministrativeModules.png" alt="Selecting administrative modules configured in their own container" width="468" /></a><br />
Selecting administrative modules configured in their own container
</div>
<div style="background-color: #eee;border: solid #777 1px;width: 468px;padding: 6px">
<p><a href="http://blogs.law.harvard.edu/brandonhaynes/files/2009/10/ModuleSelection.png" rel="lightbox[336]"><img src="http://blogs.law.harvard.edu/brandonhaynes/files/2009/10/ModuleSelection.png" alt="Screenshot illustrating the process of selecting modules to be part of a grouping" width="468" /></a><br />
Screenshot illustrating the process of selecting modules to be part of a grouping</div>



Share on:


	<a rel="nofollow" id="digg" href="javascript:window.location='http%3A%2F%2Fdigg.com%2Fsubmit%3Fphase%3D2%26amp%3Burl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F10%252F20%252Fpreview-dotnetnuke-module-containers%252F%26amp%3Btitle%3DPreview%253A%2520DotNetNuke%2520Control%2520Panel%2520Module%2520Grouping%26amp%3Bbodytext%3DAfter%2520lingering%2520in%2520limbo%2520for%2520some%2520time%252C%2520I%2520am%2520pleased%2520to%2520be%2520able%2520to%2520provide%2520some%2520screenshots%2520of%2520my%2520upcoming%2520DotNetNuke%2520Module%2520Container%2520project.%2520%25C2%25A0This%2520project%2520is%2520expected%2520to%2520be%2520released%2520into%2520beta%2520sometime%2520in%2520mid-November%252C%2520though%2520I%2520may%2520circulate%2520to%2520a%2520';" title="Digg"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow" id="del.icio.us" href="javascript:window.location='http%3A%2F%2Fdelicious.com%2Fpost%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F10%252F20%252Fpreview-dotnetnuke-module-containers%252F%26amp%3Btitle%3DPreview%253A%2520DotNetNuke%2520Control%2520Panel%2520Module%2520Grouping%26amp%3Bnotes%3DAfter%2520lingering%2520in%2520limbo%2520for%2520some%2520time%252C%2520I%2520am%2520pleased%2520to%2520be%2520able%2520to%2520provide%2520some%2520screenshots%2520of%2520my%2520upcoming%2520DotNetNuke%2520Module%2520Container%2520project.%2520%25C2%25A0This%2520project%2520is%2520expected%2520to%2520be%2520released%2520into%2520beta%2520sometime%2520in%2520mid-November%252C%2520though%2520I%2520may%2520circulate%2520to%2520a%2520';" title="del.icio.us"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow" id="facebook" href="javascript:window.location='http%3A%2F%2Fwww.facebook.com%2Fshare.php%3Fu%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F10%252F20%252Fpreview-dotnetnuke-module-containers%252F%26amp%3Bt%3DPreview%253A%2520DotNetNuke%2520Control%2520Panel%2520Module%2520Grouping';" title="Facebook"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow" id="google" href="javascript:window.location='http%3A%2F%2Fwww.google.com%2Fbookmarks%2Fmark%3Fop%3Dedit%26amp%3Bbkmk%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F10%252F20%252Fpreview-dotnetnuke-module-containers%252F%26amp%3Btitle%3DPreview%253A%2520DotNetNuke%2520Control%2520Panel%2520Module%2520Grouping%26amp%3Bannotation%3DAfter%2520lingering%2520in%2520limbo%2520for%2520some%2520time%252C%2520I%2520am%2520pleased%2520to%2520be%2520able%2520to%2520provide%2520some%2520screenshots%2520of%2520my%2520upcoming%2520DotNetNuke%2520Module%2520Container%2520project.%2520%25C2%25A0This%2520project%2520is%2520expected%2520to%2520be%2520released%2520into%2520beta%2520sometime%2520in%2520mid-November%252C%2520though%2520I%2520may%2520circulate%2520to%2520a%2520';" title="Google Bookmarks"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow" id="dotnetkicks" href="javascript:window.location='http%3A%2F%2Fwww.dotnetkicks.com%2Fkick%2F%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F10%252F20%252Fpreview-dotnetnuke-module-containers%252F%26amp%3Btitle%3DPreview%253A%2520DotNetNuke%2520Control%2520Panel%2520Module%2520Grouping';" title="DotNetKicks"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/dotnetkicks.png" title="DotNetKicks" alt="DotNetKicks" class="sociable-hovers" /></a>
	<a rel="nofollow" id="linkedin" href="javascript:window.location='http%3A%2F%2Fwww.linkedin.com%2FshareArticle%3Fmini%3Dtrue%26amp%3Burl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F10%252F20%252Fpreview-dotnetnuke-module-containers%252F%26amp%3Btitle%3DPreview%253A%2520DotNetNuke%2520Control%2520Panel%2520Module%2520Grouping%26amp%3Bsource%3DFrom%2Bthe%2BDesk%2Bof%2BBrandon%2BHaynes%2BObservations%2Babout%2Bthe%2Bintersection%2Bof%2Btechnology%252C%2Bbusiness%252C%2Band%2Bintellectual%2Bproperty%26amp%3Bsummary%3DAfter%2520lingering%2520in%2520limbo%2520for%2520some%2520time%252C%2520I%2520am%2520pleased%2520to%2520be%2520able%2520to%2520provide%2520some%2520screenshots%2520of%2520my%2520upcoming%2520DotNetNuke%2520Module%2520Container%2520project.%2520%25C2%25A0This%2520project%2520is%2520expected%2520to%2520be%2520released%2520into%2520beta%2520sometime%2520in%2520mid-November%252C%2520though%2520I%2520may%2520circulate%2520to%2520a%2520';" title="LinkedIn"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/linkedin.png" title="LinkedIn" alt="LinkedIn" class="sociable-hovers" /></a>
	<a rel="nofollow" id="stumbleupon" href="javascript:window.location='http%3A%2F%2Fwww.stumbleupon.com%2Fsubmit%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F10%252F20%252Fpreview-dotnetnuke-module-containers%252F%26amp%3Btitle%3DPreview%253A%2520DotNetNuke%2520Control%2520Panel%2520Module%2520Grouping';" title="StumbleUpon"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/stumbleupon.png" title="StumbleUpon" alt="StumbleUpon" class="sociable-hovers" /></a>
	<a rel="nofollow" id="technorati" href="javascript:window.location='http%3A%2F%2Ftechnorati.com%2Ffaves%3Fadd%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F10%252F20%252Fpreview-dotnetnuke-module-containers%252F';" title="Technorati"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/technorati.png" title="Technorati" alt="Technorati" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://blogs.law.harvard.edu/brandonhaynes/2009/10/20/preview-dotnetnuke-module-containers/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-sa/3.0/us/</creativeCommons:license>
	</item>
		<item>
		<title>Released: DotNetNuke Entity Framework Model Adapter</title>
		<link>http://blogs.law.harvard.edu/brandonhaynes/2009/09/08/dotnetnuke-entity-framework-model-adapter/</link>
		<comments>http://blogs.law.harvard.edu/brandonhaynes/2009/09/08/dotnetnuke-entity-framework-model-adapter/#comments</comments>
		<pubDate>Tue, 08 Sep 2009 13:00:10 +0000</pubDate>
		<dc:creator>Brandon Haynes</dc:creator>
				<category><![CDATA[DotNetNuke (DNN) Content Management System]]></category>
		<category><![CDATA[Entity Framework (EF)]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[DotNetNuke]]></category>
		<category><![CDATA[DotNetNuke Integration]]></category>
		<category><![CDATA[Entity Framework]]></category>

		<guid isPermaLink="false">http://blogs.law.harvard.edu/brandonhaynes/?p=296</guid>
		<description><![CDATA[The Entity Framework ObjectContext allows for development using a model automatically generated by a Visual Studio designer. However, when deployed within DotNetNuke, these attributes do not pick up the database owner and object qualifier required for correct inter-operation.  Because of this, large-scale deployment of modules using the Entity Framework is infeasible, and modules using the [...]]]></description>
			<content:encoded><![CDATA[<p>The Entity Framework <a href="http://msdn.microsoft.com/en-us/library/system.data.objects.objectcontext.aspx">ObjectContext</a> allows for development using a model automatically generated by a Visual Studio designer. However, when deployed within <a href="http://www.dotnetnuke.com">DotNetNuke</a>, these attributes do not pick up the database owner and object qualifier required for correct inter-operation.  Because of this, large-scale deployment of modules using the Entity Framework is infeasible, and modules using the technology are unfortunately limited to internal applications.</p>
<p>To remedy this issue, I have developed an adapter that converts the Entity Framework model generated by the designer into a DotNetNuke-compatible model that uses both the object qualifier and database owner specified by an end-installation.  This adapter is based off of the more <a href="http://efmodeladapter.codeplex.com/">generalized model adaptation framework</a> that I recently released.</p>
<p>My goals for any satisfactory solution were as follows:</p>
<div>
<ul>
<li>Run-time adjustment of an Entity Framework EDMX model to conform to any given DotNetNuke installation, including:
<ul>
<li>Connection-based adaptation (e.g. use of a runtime-specified connection string)</li>
</ul>
</li>
<li>Run-time adjustment of model schema to effectuate:
<ul>
<li>Adjusting data-level table and stored procedure prefixes to match the DotNetNuke installation ObjectQualifier</li>
<li>Adjusting the owner of database objects to match the DotNetNuke installation DatabaseOwner</li>
</ul>
</li>
<li>Continued use of the Visual Studio Model designer</li>
<li>No tedious changes in the compiler-generated code</li>
<li>Continued use of an assembly-embedded EDMX model (and thereby no additional or external schema deployment files)</li>
</ul>
</div>
<p>This solution extends the <a class="externalLink" href="http://efmodeladapter.codeplex.com/">Entity Framework runtime model adapter</a> to operate within a DotNetNuke extension, allowing a developer to design against an unqualified, dbo-owned DotNetNuke instance and be assured that it will deploy (and operate) correctly on any configuration that an end user might have deployed. Adaptation is largely inexpensive, and since the models are cached by type, performance is not significantly affected.</p>
<p><a href="http://dnnentityframework.codeplex.com/">Click here</a> to access the project site for additional <a href="http://dnnentityframework.codeplex.com/">details</a> and <a href="http://dnnentityframework.codeplex.com/Release/ProjectReleases.aspx">downloads</a>.  Though the content herein is protected under the license below, be sure to consult the project license (New BSD) for integration-related details.</p>
<p>As always, feedback is greatly appreciated.</p>
<p>B</p>



Share on:


	<a rel="nofollow" id="digg" href="javascript:window.location='http%3A%2F%2Fdigg.com%2Fsubmit%3Fphase%3D2%26amp%3Burl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F09%252F08%252Fdotnetnuke-entity-framework-model-adapter%252F%26amp%3Btitle%3DReleased%253A%2520DotNetNuke%2520Entity%2520Framework%2520Model%2520Adapter%26amp%3Bbodytext%3DThe%2520Entity%2520Framework%2520ObjectContext%2520allows%2520for%2520development%2520using%2520a%2520model%2520automatically%2520generated%2520by%2520a%2520Visual%2520Studio%2520designer.%2520However%252C%2520when%2520deployed%2520within%2520DotNetNuke%252C%2520these%2520attributes%2520do%2520not%2520pick%2520up%2520the%2520database%2520owner%2520and%2520object%2520qualifier%2520required%2520fo';" title="Digg"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow" id="del.icio.us" href="javascript:window.location='http%3A%2F%2Fdelicious.com%2Fpost%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F09%252F08%252Fdotnetnuke-entity-framework-model-adapter%252F%26amp%3Btitle%3DReleased%253A%2520DotNetNuke%2520Entity%2520Framework%2520Model%2520Adapter%26amp%3Bnotes%3DThe%2520Entity%2520Framework%2520ObjectContext%2520allows%2520for%2520development%2520using%2520a%2520model%2520automatically%2520generated%2520by%2520a%2520Visual%2520Studio%2520designer.%2520However%252C%2520when%2520deployed%2520within%2520DotNetNuke%252C%2520these%2520attributes%2520do%2520not%2520pick%2520up%2520the%2520database%2520owner%2520and%2520object%2520qualifier%2520required%2520fo';" title="del.icio.us"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow" id="facebook" href="javascript:window.location='http%3A%2F%2Fwww.facebook.com%2Fshare.php%3Fu%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F09%252F08%252Fdotnetnuke-entity-framework-model-adapter%252F%26amp%3Bt%3DReleased%253A%2520DotNetNuke%2520Entity%2520Framework%2520Model%2520Adapter';" title="Facebook"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow" id="google" href="javascript:window.location='http%3A%2F%2Fwww.google.com%2Fbookmarks%2Fmark%3Fop%3Dedit%26amp%3Bbkmk%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F09%252F08%252Fdotnetnuke-entity-framework-model-adapter%252F%26amp%3Btitle%3DReleased%253A%2520DotNetNuke%2520Entity%2520Framework%2520Model%2520Adapter%26amp%3Bannotation%3DThe%2520Entity%2520Framework%2520ObjectContext%2520allows%2520for%2520development%2520using%2520a%2520model%2520automatically%2520generated%2520by%2520a%2520Visual%2520Studio%2520designer.%2520However%252C%2520when%2520deployed%2520within%2520DotNetNuke%252C%2520these%2520attributes%2520do%2520not%2520pick%2520up%2520the%2520database%2520owner%2520and%2520object%2520qualifier%2520required%2520fo';" title="Google Bookmarks"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow" id="dotnetkicks" href="javascript:window.location='http%3A%2F%2Fwww.dotnetkicks.com%2Fkick%2F%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F09%252F08%252Fdotnetnuke-entity-framework-model-adapter%252F%26amp%3Btitle%3DReleased%253A%2520DotNetNuke%2520Entity%2520Framework%2520Model%2520Adapter';" title="DotNetKicks"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/dotnetkicks.png" title="DotNetKicks" alt="DotNetKicks" class="sociable-hovers" /></a>
	<a rel="nofollow" id="linkedin" href="javascript:window.location='http%3A%2F%2Fwww.linkedin.com%2FshareArticle%3Fmini%3Dtrue%26amp%3Burl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F09%252F08%252Fdotnetnuke-entity-framework-model-adapter%252F%26amp%3Btitle%3DReleased%253A%2520DotNetNuke%2520Entity%2520Framework%2520Model%2520Adapter%26amp%3Bsource%3DFrom%2Bthe%2BDesk%2Bof%2BBrandon%2BHaynes%2BObservations%2Babout%2Bthe%2Bintersection%2Bof%2Btechnology%252C%2Bbusiness%252C%2Band%2Bintellectual%2Bproperty%26amp%3Bsummary%3DThe%2520Entity%2520Framework%2520ObjectContext%2520allows%2520for%2520development%2520using%2520a%2520model%2520automatically%2520generated%2520by%2520a%2520Visual%2520Studio%2520designer.%2520However%252C%2520when%2520deployed%2520within%2520DotNetNuke%252C%2520these%2520attributes%2520do%2520not%2520pick%2520up%2520the%2520database%2520owner%2520and%2520object%2520qualifier%2520required%2520fo';" title="LinkedIn"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/linkedin.png" title="LinkedIn" alt="LinkedIn" class="sociable-hovers" /></a>
	<a rel="nofollow" id="stumbleupon" href="javascript:window.location='http%3A%2F%2Fwww.stumbleupon.com%2Fsubmit%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F09%252F08%252Fdotnetnuke-entity-framework-model-adapter%252F%26amp%3Btitle%3DReleased%253A%2520DotNetNuke%2520Entity%2520Framework%2520Model%2520Adapter';" title="StumbleUpon"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/stumbleupon.png" title="StumbleUpon" alt="StumbleUpon" class="sociable-hovers" /></a>
	<a rel="nofollow" id="technorati" href="javascript:window.location='http%3A%2F%2Ftechnorati.com%2Ffaves%3Fadd%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F09%252F08%252Fdotnetnuke-entity-framework-model-adapter%252F';" title="Technorati"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/technorati.png" title="Technorati" alt="Technorati" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://blogs.law.harvard.edu/brandonhaynes/2009/09/08/dotnetnuke-entity-framework-model-adapter/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-sa/3.0/us/</creativeCommons:license>
	</item>
		<item>
		<title>Released: Entity Framework Runtime Model Adapter</title>
		<link>http://blogs.law.harvard.edu/brandonhaynes/2009/09/08/entity-framework-model-adapter/</link>
		<comments>http://blogs.law.harvard.edu/brandonhaynes/2009/09/08/entity-framework-model-adapter/#comments</comments>
		<pubDate>Tue, 08 Sep 2009 13:00:08 +0000</pubDate>
		<dc:creator>Brandon Haynes</dc:creator>
				<category><![CDATA[Entity Framework (EF)]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Adaptation]]></category>
		<category><![CDATA[Data]]></category>
		<category><![CDATA[Entity Framework]]></category>

		<guid isPermaLink="false">http://blogs.law.harvard.edu/brandonhaynes/?p=293</guid>
		<description><![CDATA[
The ObjectContext is a base class for all Entity Framework models.  While there exists a rich API for interacting with a model, the ability to adapt the underlying schema to the (potentially varying) run-time environment presents a serious shortcoming for many production applications.  These variances can potentially involve myriad considerations, from a change in database owner [...]]]></description>
			<content:encoded><![CDATA[<div>
<p>The <a href="http://msdn.microsoft.com/en-us/library/system.data.objects.objectcontext.aspx">ObjectContext</a> is a base class for all <a href="http://msdn.microsoft.com/en-us/library/aa697427(VS.80).aspx">Entity Framework</a> models.  While there exists a rich API for interacting with a model, the ability to adapt the underlying schema to the (potentially varying) run-time environment presents a serious shortcoming for many production applications.  These variances can potentially involve myriad considerations, from a change in database owner to modified table names (often by a production-specific prefix).  This can have a serious impact on large-scale deployment of applications using the Entity Framework (those familiar with my DotNetNuke-related work will immediately understand this consideration, where a run-time environment may be configured to use an arbitrary database owner or table prefix).</p>
<p>To remedy this issue, I have developed an <a href="http://efmodeladapter.codeplex.com/">adaptive framework</a> that converts an Entity Framework model generated by the Visual Studio designer into a highly configurable result.  This framework is designed to be flexible, extendable, and highly customizable.</p>
<p><span id="more-293"></span></p>
<p>My goals for any satisfactory solution were as follows:</p>
<ul>
<li>Run-time adjustment of an Entity Framework EDMX model, including:
<ul>
<li>Connection-based adaptation (e.g. use of a runtime-specified connection string)</li>
</ul>
</li>
<li>Run-time adjustment of model schema, including:
<ul>
<li>Adjusting data-level table prefixes or suffixes</li>
<li>Adjusting the owner of database objects</li>
</ul>
</li>
<li>Continued use of the Visual Studio Model designer</li>
<li>No tedious changes in the compiler-generated code</li>
<li>Continued use of an assembly-embedded EDMX model (and thereby no additional or external schema deployment files)</li>
</ul>
<p>It is unfortunate that the object model exposed by the Entity Framework is so frustratingly difficult to extend.  The underlying metadata are overwhelmingly read-only (and, frustratingly, many potentially useful classes are either internal or sealed).  Indeed, it seemed that there was no simple remedy to the problem at hand.</p>
<p>My solution utilizes the following approach:</p>
<ul>
<li>A Connection adapter is used to walk a model (and optionally adapt a connection string based upon a run-time environment) [Goal 1].</li>
<li>During the model walk, a dependency-injected model adapter is utilized to adapt various attributes of the model (currently storage, mapping, and association) [Goal 2].  Walking is reasonably inexpensive, and since the models are cached by type, performance is not affected.</li>
<li>The framework requires only a change in base class to an AdaptingObjectContext (which itself derives from an ObjectContext).  This allows the Visual Studio editor to continue to be utilized, and no direct EDMX manipulation is required (though, frustratingly, the base class of an entity model is not adjustable through the Visual Studio UI, necessitating a change in the code-generated file) [Goal 3, 4, 5].</li>
</ul>
<p>I use dependency injection to adapt attributed entities (database, table, and function names) into their adapted counterparts.  Additional adapters could easily be constructed for other domains, should any arise (to illustrate this point, a NonTransformingAdapter is included in the release, which performs no transformations).</p>
<p><a href="http://efmodeladapter.codeplex.com/">Click here</a> to access the project site for additional <a href="http://efmodeladapter.codeplex.com/">details</a> and <a href="http://efmodeladapter.codeplex.com/Release/ProjectReleases.aspx">downloads</a>.</p>
<p>As is all of my DotNetNuke-related work, this framework is available under a liberal open-source license for ready public consumption (and extension).  Though the content herein is protected under the license below, be sure to consult the project license (New BSD) for integration-related details.</p>
<p>As always, feedback is appreciated.</p>
<p>B</p></div>



Share on:


	<a rel="nofollow" id="digg" href="javascript:window.location='http%3A%2F%2Fdigg.com%2Fsubmit%3Fphase%3D2%26amp%3Burl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F09%252F08%252Fentity-framework-model-adapter%252F%26amp%3Btitle%3DReleased%253A%2520Entity%2520Framework%2520Runtime%2520Model%2520Adapter%26amp%3Bbodytext%3D%250D%250A%250D%250AThe%25C2%25A0ObjectContext%2520is%2520a%2520base%2520class%2520for%2520all%2520Entity%2520Framework%2520models.%2520%25C2%25A0While%2520there%2520exists%2520a%2520rich%2520API%2520for%2520interacting%2520with%2520a%2520model%252C%2520the%2520ability%2520to%2520adapt%2520the%2520underlying%2520schema%2520to%2520the%2520%2528potentially%2520varying%2529%2520run-time%2520environment%2520presents%2520a%2520serious%2520shor';" title="Digg"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow" id="del.icio.us" href="javascript:window.location='http%3A%2F%2Fdelicious.com%2Fpost%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F09%252F08%252Fentity-framework-model-adapter%252F%26amp%3Btitle%3DReleased%253A%2520Entity%2520Framework%2520Runtime%2520Model%2520Adapter%26amp%3Bnotes%3D%250D%250A%250D%250AThe%25C2%25A0ObjectContext%2520is%2520a%2520base%2520class%2520for%2520all%2520Entity%2520Framework%2520models.%2520%25C2%25A0While%2520there%2520exists%2520a%2520rich%2520API%2520for%2520interacting%2520with%2520a%2520model%252C%2520the%2520ability%2520to%2520adapt%2520the%2520underlying%2520schema%2520to%2520the%2520%2528potentially%2520varying%2529%2520run-time%2520environment%2520presents%2520a%2520serious%2520shor';" title="del.icio.us"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow" id="facebook" href="javascript:window.location='http%3A%2F%2Fwww.facebook.com%2Fshare.php%3Fu%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F09%252F08%252Fentity-framework-model-adapter%252F%26amp%3Bt%3DReleased%253A%2520Entity%2520Framework%2520Runtime%2520Model%2520Adapter';" title="Facebook"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow" id="google" href="javascript:window.location='http%3A%2F%2Fwww.google.com%2Fbookmarks%2Fmark%3Fop%3Dedit%26amp%3Bbkmk%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F09%252F08%252Fentity-framework-model-adapter%252F%26amp%3Btitle%3DReleased%253A%2520Entity%2520Framework%2520Runtime%2520Model%2520Adapter%26amp%3Bannotation%3D%250D%250A%250D%250AThe%25C2%25A0ObjectContext%2520is%2520a%2520base%2520class%2520for%2520all%2520Entity%2520Framework%2520models.%2520%25C2%25A0While%2520there%2520exists%2520a%2520rich%2520API%2520for%2520interacting%2520with%2520a%2520model%252C%2520the%2520ability%2520to%2520adapt%2520the%2520underlying%2520schema%2520to%2520the%2520%2528potentially%2520varying%2529%2520run-time%2520environment%2520presents%2520a%2520serious%2520shor';" title="Google Bookmarks"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow" id="dotnetkicks" href="javascript:window.location='http%3A%2F%2Fwww.dotnetkicks.com%2Fkick%2F%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F09%252F08%252Fentity-framework-model-adapter%252F%26amp%3Btitle%3DReleased%253A%2520Entity%2520Framework%2520Runtime%2520Model%2520Adapter';" title="DotNetKicks"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/dotnetkicks.png" title="DotNetKicks" alt="DotNetKicks" class="sociable-hovers" /></a>
	<a rel="nofollow" id="linkedin" href="javascript:window.location='http%3A%2F%2Fwww.linkedin.com%2FshareArticle%3Fmini%3Dtrue%26amp%3Burl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F09%252F08%252Fentity-framework-model-adapter%252F%26amp%3Btitle%3DReleased%253A%2520Entity%2520Framework%2520Runtime%2520Model%2520Adapter%26amp%3Bsource%3DFrom%2Bthe%2BDesk%2Bof%2BBrandon%2BHaynes%2BObservations%2Babout%2Bthe%2Bintersection%2Bof%2Btechnology%252C%2Bbusiness%252C%2Band%2Bintellectual%2Bproperty%26amp%3Bsummary%3D%250D%250A%250D%250AThe%25C2%25A0ObjectContext%2520is%2520a%2520base%2520class%2520for%2520all%2520Entity%2520Framework%2520models.%2520%25C2%25A0While%2520there%2520exists%2520a%2520rich%2520API%2520for%2520interacting%2520with%2520a%2520model%252C%2520the%2520ability%2520to%2520adapt%2520the%2520underlying%2520schema%2520to%2520the%2520%2528potentially%2520varying%2529%2520run-time%2520environment%2520presents%2520a%2520serious%2520shor';" title="LinkedIn"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/linkedin.png" title="LinkedIn" alt="LinkedIn" class="sociable-hovers" /></a>
	<a rel="nofollow" id="stumbleupon" href="javascript:window.location='http%3A%2F%2Fwww.stumbleupon.com%2Fsubmit%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F09%252F08%252Fentity-framework-model-adapter%252F%26amp%3Btitle%3DReleased%253A%2520Entity%2520Framework%2520Runtime%2520Model%2520Adapter';" title="StumbleUpon"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/stumbleupon.png" title="StumbleUpon" alt="StumbleUpon" class="sociable-hovers" /></a>
	<a rel="nofollow" id="technorati" href="javascript:window.location='http%3A%2F%2Ftechnorati.com%2Ffaves%3Fadd%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F09%252F08%252Fentity-framework-model-adapter%252F';" title="Technorati"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/technorati.png" title="Technorati" alt="Technorati" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://blogs.law.harvard.edu/brandonhaynes/2009/09/08/entity-framework-model-adapter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-sa/3.0/us/</creativeCommons:license>
	</item>
		<item>
		<title>Screenshots: DotNetNuke and Magento Integration Experiment</title>
		<link>http://blogs.law.harvard.edu/brandonhaynes/2009/08/31/screenshots-dotnetnuke-and-magento-integration-experiment/</link>
		<comments>http://blogs.law.harvard.edu/brandonhaynes/2009/08/31/screenshots-dotnetnuke-and-magento-integration-experiment/#comments</comments>
		<pubDate>Mon, 31 Aug 2009 14:34:04 +0000</pubDate>
		<dc:creator>Brandon Haynes</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[5.1]]></category>
		<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[DotNetNuke]]></category>
		<category><![CDATA[DotNetNuke (DNN) Content Management System]]></category>
		<category><![CDATA[DotNetNuke 5.1]]></category>
		<category><![CDATA[DotNetNuke Integration]]></category>
		<category><![CDATA[E-Commerce]]></category>
		<category><![CDATA[ECommerce]]></category>
		<category><![CDATA[Magento]]></category>

		<guid isPermaLink="false">http://blogs.law.harvard.edu/brandonhaynes/?p=282</guid>
		<description><![CDATA[Over the last few months, I have been doing some initial architectural research regarding the integration of DotNetNuke with arbitrary external e-commerce systems.  Note that this research is highly embryonic, largely experimental, and highly likely to not reach any sort of production-ready fruition.  Its purpose is to inspire discussion, not demonstrate code.  Caveat lector!
As one [...]]]></description>
			<content:encoded><![CDATA[<p>Over the last few months, I have been doing some initial architectural research regarding the integration of DotNetNuke with arbitrary external e-commerce systems.  Note that this research is highly embryonic, largely experimental, and highly likely to not reach any sort of production-ready fruition.  Its purpose is to inspire discussion, not demonstrate code.  <em>Caveat lector</em>!</p>
<p>As one of my goals is reasonable provider-independence (via <a href="http://en.wikipedia.org/wiki/Adapter_pattern">adaptation</a>), this is not about realizing any particular vendor (despite the fact that I address one specific such vendor herein).  That said, I have been asked by several parties to share a bit more about where this stands; it is with this in mind that I present an initial update.</p>
<p><span id="more-282"></span></p>
<p>In selecting a set of third-party providers, it was of some importance to deal with an e-commerce system that was reasonably foreign to the .NET universe (within which DotNetNuke lives).  With this in mind, I selected the <a href="http://www.magentocommerce.com/">Magento framework</a> as an initial target for review.  In addition to being PHP-based, it boasts a reasonably sophisticated API, a beautiful interface, and solid overall architecture.</p>
<p>Integration in conformance with my internal architectural specifications was largely straightforward.  However, Magento currently lacks any meaningful cart-API.  This means that, <em>inter alia</em>, there is no API method by which an external consumer may retrieve a customer&#8217;s current basket (without resorting to screen-scrapes and other such horrors).  As such, it remains incomplete as an option for fully satisfactory externalization &#8212; though it is tantalizingly close.  It is my hope that this omission might be corrected in some subsequent Magento release, though I have no inside information about plans for future API development.</p>
<p>I present the screenshots below &#8212; designed to closely emulate the <a href="http://demo.magentocommerce.com/">Magento model store</a> &#8212; as a point of discussion about the potential future of DotNetNuke and e-commerce.  All components displayed therein are actual, working modules.  In my opinion, this is what e-commerce on the DotNetNuke framework should look like.</p>
<p>Note that, in the area of e-commerce, I am largely constrained by contractual IPR constraints, and this significantly affects my ability to release the constituent modules.  However, as my architectural research continues, it is my hope that these data might be partitioned and released in an open-source manner (as is all of my other DotNetNuke-related work).</p>
<p>As always, comments are appreciated.</p>
<h4>DotNetNuke and Magento Integration Screenshots</h4>

<a href='http://blogs.law.harvard.edu/brandonhaynes/2009/08/31/screenshots-dotnetnuke-and-magento-integration-experiment/magento-experiment-catalog/' title='DotNetNuke and Magento Integration: Experimental Catalog Page'><img width="150" height="150" src="http://blogs.law.harvard.edu/brandonhaynes/files/2009/08/magento-experiment-catalog-150x150.png" class="attachment-thumbnail" alt="DotNetNuke and Magento Integration: Experimental Catalog Page" title="DotNetNuke and Magento Integration: Experimental Catalog Page" /></a>
<a href='http://blogs.law.harvard.edu/brandonhaynes/2009/08/31/screenshots-dotnetnuke-and-magento-integration-experiment/magento-experiment-basket/' title='DotNetNuke and Magento Integration: Experimental Basket Page'><img width="150" height="150" src="http://blogs.law.harvard.edu/brandonhaynes/files/2009/08/magento-experiment-basket-150x150.png" class="attachment-thumbnail" alt="DotNetNuke and Magento Integration: Experimental Basket Page" title="DotNetNuke and Magento Integration: Experimental Basket Page" /></a>

<p>Attribution Notice:  These screenshots above are derived from <a href="http://www.magentocommerce.com/license/">Magento IP</a> released under an <a href="http://www.opensource.org/licenses/osl-3.0.php">Open Source License (&#8221;OSL&#8221;) version 3.0</a>.  As such, I am required per §1.C to license these images under the same; all other rights (including rights over the <span><span>accompanying </span></span>text) are reserved per the notification below.</p>



Share on:


	<a rel="nofollow" id="digg" href="javascript:window.location='http%3A%2F%2Fdigg.com%2Fsubmit%3Fphase%3D2%26amp%3Burl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F08%252F31%252Fscreenshots-dotnetnuke-and-magento-integration-experiment%252F%26amp%3Btitle%3DScreenshots%253A%2520DotNetNuke%2520and%2520Magento%2520Integration%2520Experiment%26amp%3Bbodytext%3DOver%2520the%2520last%2520few%2520months%252C%2520I%2520have%2520been%2520doing%2520some%2520initial%2520architectural%2520research%2520regarding%2520the%2520integration%2520of%2520DotNetNuke%2520with%2520arbitrary%2520external%2520e-commerce%2520systems.%2520%25C2%25A0Note%2520that%2520this%2520research%2520is%2520highly%2520embryonic%252C%2520largely%2520experimental%252C%2520and%2520highly%2520likely';" title="Digg"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow" id="del.icio.us" href="javascript:window.location='http%3A%2F%2Fdelicious.com%2Fpost%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F08%252F31%252Fscreenshots-dotnetnuke-and-magento-integration-experiment%252F%26amp%3Btitle%3DScreenshots%253A%2520DotNetNuke%2520and%2520Magento%2520Integration%2520Experiment%26amp%3Bnotes%3DOver%2520the%2520last%2520few%2520months%252C%2520I%2520have%2520been%2520doing%2520some%2520initial%2520architectural%2520research%2520regarding%2520the%2520integration%2520of%2520DotNetNuke%2520with%2520arbitrary%2520external%2520e-commerce%2520systems.%2520%25C2%25A0Note%2520that%2520this%2520research%2520is%2520highly%2520embryonic%252C%2520largely%2520experimental%252C%2520and%2520highly%2520likely';" title="del.icio.us"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow" id="facebook" href="javascript:window.location='http%3A%2F%2Fwww.facebook.com%2Fshare.php%3Fu%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F08%252F31%252Fscreenshots-dotnetnuke-and-magento-integration-experiment%252F%26amp%3Bt%3DScreenshots%253A%2520DotNetNuke%2520and%2520Magento%2520Integration%2520Experiment';" title="Facebook"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow" id="google" href="javascript:window.location='http%3A%2F%2Fwww.google.com%2Fbookmarks%2Fmark%3Fop%3Dedit%26amp%3Bbkmk%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F08%252F31%252Fscreenshots-dotnetnuke-and-magento-integration-experiment%252F%26amp%3Btitle%3DScreenshots%253A%2520DotNetNuke%2520and%2520Magento%2520Integration%2520Experiment%26amp%3Bannotation%3DOver%2520the%2520last%2520few%2520months%252C%2520I%2520have%2520been%2520doing%2520some%2520initial%2520architectural%2520research%2520regarding%2520the%2520integration%2520of%2520DotNetNuke%2520with%2520arbitrary%2520external%2520e-commerce%2520systems.%2520%25C2%25A0Note%2520that%2520this%2520research%2520is%2520highly%2520embryonic%252C%2520largely%2520experimental%252C%2520and%2520highly%2520likely';" title="Google Bookmarks"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow" id="dotnetkicks" href="javascript:window.location='http%3A%2F%2Fwww.dotnetkicks.com%2Fkick%2F%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F08%252F31%252Fscreenshots-dotnetnuke-and-magento-integration-experiment%252F%26amp%3Btitle%3DScreenshots%253A%2520DotNetNuke%2520and%2520Magento%2520Integration%2520Experiment';" title="DotNetKicks"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/dotnetkicks.png" title="DotNetKicks" alt="DotNetKicks" class="sociable-hovers" /></a>
	<a rel="nofollow" id="linkedin" href="javascript:window.location='http%3A%2F%2Fwww.linkedin.com%2FshareArticle%3Fmini%3Dtrue%26amp%3Burl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F08%252F31%252Fscreenshots-dotnetnuke-and-magento-integration-experiment%252F%26amp%3Btitle%3DScreenshots%253A%2520DotNetNuke%2520and%2520Magento%2520Integration%2520Experiment%26amp%3Bsource%3DFrom%2Bthe%2BDesk%2Bof%2BBrandon%2BHaynes%2BObservations%2Babout%2Bthe%2Bintersection%2Bof%2Btechnology%252C%2Bbusiness%252C%2Band%2Bintellectual%2Bproperty%26amp%3Bsummary%3DOver%2520the%2520last%2520few%2520months%252C%2520I%2520have%2520been%2520doing%2520some%2520initial%2520architectural%2520research%2520regarding%2520the%2520integration%2520of%2520DotNetNuke%2520with%2520arbitrary%2520external%2520e-commerce%2520systems.%2520%25C2%25A0Note%2520that%2520this%2520research%2520is%2520highly%2520embryonic%252C%2520largely%2520experimental%252C%2520and%2520highly%2520likely';" title="LinkedIn"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/linkedin.png" title="LinkedIn" alt="LinkedIn" class="sociable-hovers" /></a>
	<a rel="nofollow" id="stumbleupon" href="javascript:window.location='http%3A%2F%2Fwww.stumbleupon.com%2Fsubmit%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F08%252F31%252Fscreenshots-dotnetnuke-and-magento-integration-experiment%252F%26amp%3Btitle%3DScreenshots%253A%2520DotNetNuke%2520and%2520Magento%2520Integration%2520Experiment';" title="StumbleUpon"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/stumbleupon.png" title="StumbleUpon" alt="StumbleUpon" class="sociable-hovers" /></a>
	<a rel="nofollow" id="technorati" href="javascript:window.location='http%3A%2F%2Ftechnorati.com%2Ffaves%3Fadd%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F08%252F31%252Fscreenshots-dotnetnuke-and-magento-integration-experiment%252F';" title="Technorati"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/technorati.png" title="Technorati" alt="Technorati" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://blogs.law.harvard.edu/brandonhaynes/2009/08/31/screenshots-dotnetnuke-and-magento-integration-experiment/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-sa/3.0/us/</creativeCommons:license>
	</item>
		<item>
		<title>Whitepaper: DotNetNuke Multi-Factor Authentication</title>
		<link>http://blogs.law.harvard.edu/brandonhaynes/2009/08/28/whitepaper-dotnetnuke-multi-factor-authentication/</link>
		<comments>http://blogs.law.harvard.edu/brandonhaynes/2009/08/28/whitepaper-dotnetnuke-multi-factor-authentication/#comments</comments>
		<pubDate>Fri, 28 Aug 2009 14:19:48 +0000</pubDate>
		<dc:creator>Brandon Haynes</dc:creator>
				<category><![CDATA[DotNetNuke (DNN) Content Management System]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Authentication]]></category>
		<category><![CDATA[DotNetNuke]]></category>
		<category><![CDATA[DotNetNuke Integration]]></category>
		<category><![CDATA[Multi-Factor]]></category>
		<category><![CDATA[Multifactor]]></category>
		<category><![CDATA[Provider]]></category>

		<guid isPermaLink="false">http://blogs.law.harvard.edu/brandonhaynes/?p=249</guid>
		<description><![CDATA[I am pleased to make available a whitepaper detailing the high-level motivation and approach involved in the creation of the recently-released DotNetNuke Multi-Factor Authentication Provider, along with a discussion of the unique characteristics of a DotNetNuke installation that render the approaches of other vendors (e.g. RSA SecurID) incomplete or unsatisfactory.  Additionally, each out-of-the-box factor [...]]]></description>
			<content:encoded><![CDATA[<p>I am pleased to make available a whitepaper detailing the high-level motivation and approach involved in the creation of the recently-released <a href="http://dnnmultifactor.codeplex.com/">DotNetNuke Multi-Factor Authentication Provider</a>, along with a discussion of the unique characteristics of a <a href="http://www.dotnetnuke.com">DotNetNuke</a> installation that render the approaches of other vendors (e.g. <a href="http://rsa.com/node.aspx?id=1156">RSA SecurID</a>) incomplete or unsatisfactory.  Additionally, each out-of-the-box factor is described in general detail in a format that is digestible by an audience of varying technical sophistication.</p>
<p>This paper is intended for all audiences who might have an interest in overall DotNetNuke installation security, and is designed to assist management in identifying an appropriate level of authentication-related risk.</p>
<ul>
<li><a href="http://blogs.law.harvard.edu/brandonhaynes/files/2009/08/multifactor-authentication-in-dotnetnuke.pdf"><strong>Download the Multi-Factor Authentication in DotNetNuke Whitepaper</strong></a></li>
<li><a href="http://dnnmultifactor.codeplex.com/">Learn more about the Multi-Factor Authentication Provider</a></li>
<li><a href="http://www.dotnetnuke.com">Learn more about the DotNetNuke Web Application Framework</a></li>
</ul>



Share on:


	<a rel="nofollow" id="digg" href="javascript:window.location='http%3A%2F%2Fdigg.com%2Fsubmit%3Fphase%3D2%26amp%3Burl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F08%252F28%252Fwhitepaper-dotnetnuke-multi-factor-authentication%252F%26amp%3Btitle%3DWhitepaper%253A%2520DotNetNuke%2520Multi-Factor%2520Authentication%26amp%3Bbodytext%3DI%2520am%2520pleased%2520to%2520make%2520available%2520a%2520whitepaper%2520detailing%2520the%2520high-level%2520motivation%2520and%2520approach%2520involved%2520in%2520the%2520creation%2520of%2520the%2520recently-released%2520DotNetNuke%2520Multi-Factor%2520Authentication%2520Provider%252C%2520along%2520with%2520a%2520discussion%2520of%2520the%2520unique%2520characteristics%2520of%2520a';" title="Digg"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow" id="del.icio.us" href="javascript:window.location='http%3A%2F%2Fdelicious.com%2Fpost%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F08%252F28%252Fwhitepaper-dotnetnuke-multi-factor-authentication%252F%26amp%3Btitle%3DWhitepaper%253A%2520DotNetNuke%2520Multi-Factor%2520Authentication%26amp%3Bnotes%3DI%2520am%2520pleased%2520to%2520make%2520available%2520a%2520whitepaper%2520detailing%2520the%2520high-level%2520motivation%2520and%2520approach%2520involved%2520in%2520the%2520creation%2520of%2520the%2520recently-released%2520DotNetNuke%2520Multi-Factor%2520Authentication%2520Provider%252C%2520along%2520with%2520a%2520discussion%2520of%2520the%2520unique%2520characteristics%2520of%2520a';" title="del.icio.us"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow" id="facebook" href="javascript:window.location='http%3A%2F%2Fwww.facebook.com%2Fshare.php%3Fu%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F08%252F28%252Fwhitepaper-dotnetnuke-multi-factor-authentication%252F%26amp%3Bt%3DWhitepaper%253A%2520DotNetNuke%2520Multi-Factor%2520Authentication';" title="Facebook"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow" id="google" href="javascript:window.location='http%3A%2F%2Fwww.google.com%2Fbookmarks%2Fmark%3Fop%3Dedit%26amp%3Bbkmk%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F08%252F28%252Fwhitepaper-dotnetnuke-multi-factor-authentication%252F%26amp%3Btitle%3DWhitepaper%253A%2520DotNetNuke%2520Multi-Factor%2520Authentication%26amp%3Bannotation%3DI%2520am%2520pleased%2520to%2520make%2520available%2520a%2520whitepaper%2520detailing%2520the%2520high-level%2520motivation%2520and%2520approach%2520involved%2520in%2520the%2520creation%2520of%2520the%2520recently-released%2520DotNetNuke%2520Multi-Factor%2520Authentication%2520Provider%252C%2520along%2520with%2520a%2520discussion%2520of%2520the%2520unique%2520characteristics%2520of%2520a';" title="Google Bookmarks"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow" id="dotnetkicks" href="javascript:window.location='http%3A%2F%2Fwww.dotnetkicks.com%2Fkick%2F%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F08%252F28%252Fwhitepaper-dotnetnuke-multi-factor-authentication%252F%26amp%3Btitle%3DWhitepaper%253A%2520DotNetNuke%2520Multi-Factor%2520Authentication';" title="DotNetKicks"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/dotnetkicks.png" title="DotNetKicks" alt="DotNetKicks" class="sociable-hovers" /></a>
	<a rel="nofollow" id="linkedin" href="javascript:window.location='http%3A%2F%2Fwww.linkedin.com%2FshareArticle%3Fmini%3Dtrue%26amp%3Burl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F08%252F28%252Fwhitepaper-dotnetnuke-multi-factor-authentication%252F%26amp%3Btitle%3DWhitepaper%253A%2520DotNetNuke%2520Multi-Factor%2520Authentication%26amp%3Bsource%3DFrom%2Bthe%2BDesk%2Bof%2BBrandon%2BHaynes%2BObservations%2Babout%2Bthe%2Bintersection%2Bof%2Btechnology%252C%2Bbusiness%252C%2Band%2Bintellectual%2Bproperty%26amp%3Bsummary%3DI%2520am%2520pleased%2520to%2520make%2520available%2520a%2520whitepaper%2520detailing%2520the%2520high-level%2520motivation%2520and%2520approach%2520involved%2520in%2520the%2520creation%2520of%2520the%2520recently-released%2520DotNetNuke%2520Multi-Factor%2520Authentication%2520Provider%252C%2520along%2520with%2520a%2520discussion%2520of%2520the%2520unique%2520characteristics%2520of%2520a';" title="LinkedIn"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/linkedin.png" title="LinkedIn" alt="LinkedIn" class="sociable-hovers" /></a>
	<a rel="nofollow" id="stumbleupon" href="javascript:window.location='http%3A%2F%2Fwww.stumbleupon.com%2Fsubmit%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F08%252F28%252Fwhitepaper-dotnetnuke-multi-factor-authentication%252F%26amp%3Btitle%3DWhitepaper%253A%2520DotNetNuke%2520Multi-Factor%2520Authentication';" title="StumbleUpon"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/stumbleupon.png" title="StumbleUpon" alt="StumbleUpon" class="sociable-hovers" /></a>
	<a rel="nofollow" id="technorati" href="javascript:window.location='http%3A%2F%2Ftechnorati.com%2Ffaves%3Fadd%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F08%252F28%252Fwhitepaper-dotnetnuke-multi-factor-authentication%252F';" title="Technorati"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/technorati.png" title="Technorati" alt="Technorati" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://blogs.law.harvard.edu/brandonhaynes/2009/08/28/whitepaper-dotnetnuke-multi-factor-authentication/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-sa/3.0/us/</creativeCommons:license>
	</item>
		<item>
		<title>Beta Release: DotNetNuke Amazon S3 Folder Integration Providers</title>
		<link>http://blogs.law.harvard.edu/brandonhaynes/2009/06/22/released-dotnetnuke-amazon-s3-folder-integration-providers/</link>
		<comments>http://blogs.law.harvard.edu/brandonhaynes/2009/06/22/released-dotnetnuke-amazon-s3-folder-integration-providers/#comments</comments>
		<pubDate>Mon, 22 Jun 2009 12:43:32 +0000</pubDate>
		<dc:creator>Brandon Haynes</dc:creator>
				<category><![CDATA[DotNetNuke (DNN) Content Management System]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[5.1]]></category>
		<category><![CDATA[Amazon S3]]></category>
		<category><![CDATA[Authorization]]></category>
		<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[DotNetNuke]]></category>
		<category><![CDATA[DotNetNuke 5.1]]></category>
		<category><![CDATA[DotNetNuke Integration]]></category>
		<category><![CDATA[Provider]]></category>

		<guid isPermaLink="false">http://blogs.law.harvard.edu/brandonhaynes/?p=199</guid>
		<description><![CDATA[I am pleased to announce a beta release of my Amazon S3 integration authorization and data providers.  It may be downloaded via CodePlex on its project homepage.  As is all of my DotNetNuke work, this project is fully open-source and available under a liberal BSD license.
The DotNetNuke web application framework offers multiple file persistence options out-of-the-box, including [...]]]></description>
			<content:encoded><![CDATA[<p>I am pleased to announce a <a href="http://dnnamazons3.codeplex.com/">beta release</a> of my <a href="http://aws.amazon.com/s3">Amazon S3</a> integration authorization and data providers.  It may be downloaded via CodePlex on its <a href="http://dnnamazons3.codeplex.com/">project homepage</a>.  As is all of my DotNetNuke work, this project is fully open-source and available under a liberal <a href="http://dnnamazons3.codeplex.com/license">BSD license</a>.</p>
<p>The <a class="externalLink" href="http://www.dotnetnuke.com/">DotNetNuke web application framework</a> offers multiple file persistence options out-of-the-box, including file-system storage (both unsecured and secured by ACL), along with ACL-secured database storage. When creating a link to a resource, the DotNetNuke UI provides a convenient list of these files, and also allows direct input of arbitrary URI.</p>
<p>However, there exists no ready method by which an administrator might link to a known set of files persisted external to the installation. While direct URI input might be used here, it requires knowledge of these data, and does not allow for enumeration and management of the external objects themselves.</p>
<p>This project attempts to bridge that gap by integrating resources persisted on the Amazon S3 into the DotNetNuke framework. Resources stored there are enumerable via the File Manager and selectable via the URL control. Throughout the core framework, these external resources are treated identically to database-secured resources, including observance of Amazon S3 ACL, automatic synchronization, and (reasonably friendly) 301 Redirects to the Amazon S3 when accessed via LinkClick.aspx.</p>
<p>This is effectuated via customization of two providers: authorization and data. The authorization provider integrates Amazon S3 ACLs for external resources, and the data provider allows enumeration of and details about the external resources themselves.</p>
<p><span id="more-199"></span></p>
<h2>Project Goals</h2>
<ul>
<li>Integration with the <a class="externalLink" href="http://aws.amazon.com/s3">Amazon S3</a> for data storage external to the DotNetNuke framework.</li>
<li>Seamless integration into the DotNetNuke UI, both at the File Manager and URL controls. For example:
<ul>
<li>Amazon S3 objects should appear in the File Manager just like any other internal files,</li>
<li>Amazon S3 objects should appear in the core URL control, and</li>
<li>Insofar as is feasible, Amazon S3 files should be indistinguishable from their secured storage counterparts.</li>
</ul>
</li>
<li>No external Amazon S3 UI or kludgy link generation</li>
<li>Whenever possible, utilization of 301 Redirects to Amazon S3 resource URIs.</li>
<li>Full observance of the external Amazon S3 bucket ACLs.</li>
<li>Require no core changes and utilize only existing DotNetNuke extension points</li>
</ul>
<h2>Configuration and Usage</h2>
<p>After installation, two new profile properties will be automatically created across all portals:</p>
<ul>
<li>S3Key, and</li>
<li>S3Secret</li>
</ul>
<p>The names of these properties may be changed in the web.config near the configuration/dotnetnuke/permissions node). To enable a portal for Amazon S3 integration, the key and secret <strong>for the portal administrator</strong> must be configured with valid values.</p>
<p>Any user may submit his or her own key and secret information at the profile level; these data will be used to circumscribe the set of available Amazon S3 objects for that user.</p>
<p>After a portal&#8217;s administrator account is configured with a valid Amazon S3 key and secret, the file manager will display those buckets and objects stored on the service:</p>
<div id="attachment_133" class="wp-caption aligncenter" style="width: 310px"><a rel="attachment wp-att-133" href="http://blogs.law.harvard.edu/brandonhaynes/2009/06/08/preview-amazon-s3-integration-dodnn-conference/amazon-s3-teaser/"><img class="size-medium wp-image-133" src="http://blogs.law.harvard.edu/brandonhaynes/files/2009/06/amazon-s3-teaser-300x167.png" alt="A screenshot demonstrating Amazon S3 cloud-based integration on the DotNetNuke platform" width="300" height="167" /></a><p class="wp-caption-text">A screenshot demonstrating Amazon S3 cloud-based integration on the DotNetNuke platform</p></div>
<p>The list of available buckets will be circumscribed by the permissions granted by the administrator&#8217;s S3 account. Because DotNetNuke does not support file-level ACLs, objects within an Amazon S3 bucket are assumed to have an ACL identical to that present on the bucket itself (though a more restrictive policy will still be enforced by the S3 service).</p>
<p>Similarly, the DotNetNuke URL control will display a list of buckets accessible by the accessing user, and allow selection of the objects therein:</p>
<div id="attachment_172" class="wp-caption aligncenter" style="width: 304px"><a rel="attachment wp-att-172" href="http://blogs.law.harvard.edu/brandonhaynes/2009/06/16/presentation-materials-advanced-authorization-in-dotnetnuke/amazon-s3-uri-teaser/"><img class="size-medium wp-image-172" src="http://blogs.law.harvard.edu/brandonhaynes/files/2009/06/amazon-s3-uri-teaser-294x300.png" alt="Amazon S3 Demonstration Displaying URI Selection" width="294" height="300" /></a><p class="wp-caption-text">Amazon S3 Demonstration Displaying URI Selection</p></div>
<h2>Discussion</h2>
<h3>Overall Authorization Model</h3>
<p>There are a number of areas in which the authorization policy enforced by the provider might be improved. In its current form it is minimally complete, but could easily be made more robust and sensitive to user context (in particular, no attempt is made to deal with Amazon S3 user-specific ACL assignment). The provider is largely aimed at objects intended to be made available to &#8220;everyone.&#8221;</p>
<h3>File-based ACLs</h3>
<p>DotNetNuke does not support file-based ACLs, but these are allowed and enforced by the Amazon S3 service.</p>
<h3>Generated URIs</h3>
<p>The 301 redirect URIs created by the data provider are not per-user, and thereby require read-permission on the &#8220;everyone&#8221; group for the S3 object in question. A stronger model might generate a valid read URI for the accessing user, so long as that user has read permissions on the object itself.</p>
<h3>C<span style="text-decoration: line-through">R</span>UD</h3>
<p>Only read access is implemented for Amazon S3 buckets and objects; while it remains quite straightforward to implement the other access characteristics, these are left to the (many) other <a href="http://www.google.com/search?q=amazon+s3+managers">S3 managers</a> that exist for these purposes.</p>
<h3>Shared secret storage</h3>
<p>Shared secrets are stored in plain-text on a user&#8217;s profile; this is generally a horrible security policy (Alex Shirley will certainly yell at me for doing this after I strongly discouraged him from doing so in a similar project). Because federated authentication is not possible with the Amazon S3 service, this secret cannot be made application-specific and must be stored <em>somewhere</em>.  The solution here is an encrypted profile property type; this is clearly outside the scope of this project, but is on my radar for a future complimentary project.</p>
<h3>Performance</h3>
<p>A number of internal operations are O(n*m). While some of these are cached by the underlying DotNetNuke framework, the integration implementation itself could be improved via additional caching and lookup tables.</p>
<h2>Your Feedback is Needed!</h2>
<p>As this project moves toward an initial production release, it will rely heavily on the feedback provided by the community.  Any such feedback &#8212; including comments, ratings, and constructive criticism &#8212; is greatly appreciated.</p>
<p>B</p>



Share on:


	<a rel="nofollow" id="digg" href="javascript:window.location='http%3A%2F%2Fdigg.com%2Fsubmit%3Fphase%3D2%26amp%3Burl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F06%252F22%252Freleased-dotnetnuke-amazon-s3-folder-integration-providers%252F%26amp%3Btitle%3DBeta%2520Release%253A%2520DotNetNuke%2520Amazon%2520S3%2520Folder%2520Integration%2520Providers%26amp%3Bbodytext%3DI%2520am%2520pleased%2520to%2520announce%2520a%2520beta%2520release%2520of%2520my%25C2%25A0Amazon%2520S3%2520integration%2520authorization%2520and%2520data%2520providers.%2520%25C2%25A0It%2520may%2520be%2520downloaded%2520via%2520CodePlex%2520on%2520its%2520project%2520homepage.%2520%25C2%25A0As%2520is%2520all%2520of%2520my%2520DotNetNuke%2520work%252C%2520this%2520project%2520is%2520fully%2520open-source%2520and%2520available%2520und';" title="Digg"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow" id="del.icio.us" href="javascript:window.location='http%3A%2F%2Fdelicious.com%2Fpost%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F06%252F22%252Freleased-dotnetnuke-amazon-s3-folder-integration-providers%252F%26amp%3Btitle%3DBeta%2520Release%253A%2520DotNetNuke%2520Amazon%2520S3%2520Folder%2520Integration%2520Providers%26amp%3Bnotes%3DI%2520am%2520pleased%2520to%2520announce%2520a%2520beta%2520release%2520of%2520my%25C2%25A0Amazon%2520S3%2520integration%2520authorization%2520and%2520data%2520providers.%2520%25C2%25A0It%2520may%2520be%2520downloaded%2520via%2520CodePlex%2520on%2520its%2520project%2520homepage.%2520%25C2%25A0As%2520is%2520all%2520of%2520my%2520DotNetNuke%2520work%252C%2520this%2520project%2520is%2520fully%2520open-source%2520and%2520available%2520und';" title="del.icio.us"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow" id="facebook" href="javascript:window.location='http%3A%2F%2Fwww.facebook.com%2Fshare.php%3Fu%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F06%252F22%252Freleased-dotnetnuke-amazon-s3-folder-integration-providers%252F%26amp%3Bt%3DBeta%2520Release%253A%2520DotNetNuke%2520Amazon%2520S3%2520Folder%2520Integration%2520Providers';" title="Facebook"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow" id="google" href="javascript:window.location='http%3A%2F%2Fwww.google.com%2Fbookmarks%2Fmark%3Fop%3Dedit%26amp%3Bbkmk%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F06%252F22%252Freleased-dotnetnuke-amazon-s3-folder-integration-providers%252F%26amp%3Btitle%3DBeta%2520Release%253A%2520DotNetNuke%2520Amazon%2520S3%2520Folder%2520Integration%2520Providers%26amp%3Bannotation%3DI%2520am%2520pleased%2520to%2520announce%2520a%2520beta%2520release%2520of%2520my%25C2%25A0Amazon%2520S3%2520integration%2520authorization%2520and%2520data%2520providers.%2520%25C2%25A0It%2520may%2520be%2520downloaded%2520via%2520CodePlex%2520on%2520its%2520project%2520homepage.%2520%25C2%25A0As%2520is%2520all%2520of%2520my%2520DotNetNuke%2520work%252C%2520this%2520project%2520is%2520fully%2520open-source%2520and%2520available%2520und';" title="Google Bookmarks"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow" id="dotnetkicks" href="javascript:window.location='http%3A%2F%2Fwww.dotnetkicks.com%2Fkick%2F%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F06%252F22%252Freleased-dotnetnuke-amazon-s3-folder-integration-providers%252F%26amp%3Btitle%3DBeta%2520Release%253A%2520DotNetNuke%2520Amazon%2520S3%2520Folder%2520Integration%2520Providers';" title="DotNetKicks"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/dotnetkicks.png" title="DotNetKicks" alt="DotNetKicks" class="sociable-hovers" /></a>
	<img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/linkedin.png" title="LinkedIn" alt="LinkedIn" class="sociable-hovers" /></a>
	<a rel="nofollow" id="stumbleupon" href="javascript:window.location='http%3A%2F%2Fwww.stumbleupon.com%2Fsubmit%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F06%252F22%252Freleased-dotnetnuke-amazon-s3-folder-integration-providers%252F%26amp%3Btitle%3DBeta%2520Release%253A%2520DotNetNuke%2520Amazon%2520S3%2520Folder%2520Integration%2520Providers';" title="StumbleUpon"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/stumbleupon.png" title="StumbleUpon" alt="StumbleUpon" class="sociable-hovers" /></a>
	<a rel="nofollow" id="technorati" href="javascript:window.location='http%3A%2F%2Ftechnorati.com%2Ffaves%3Fadd%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F06%252F22%252Freleased-dotnetnuke-amazon-s3-folder-integration-providers%252F';" title="Technorati"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/technorati.png" title="Technorati" alt="Technorati" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://blogs.law.harvard.edu/brandonhaynes/2009/06/22/released-dotnetnuke-amazon-s3-folder-integration-providers/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-sa/3.0/us/</creativeCommons:license>
	</item>
		<item>
		<title>Downloads: Commerce Server UpmMembershipProvider and DotNetNuke</title>
		<link>http://blogs.law.harvard.edu/brandonhaynes/2009/06/17/downloads-commerce-server-upmmembershipprovider-and-dotnetnuke/</link>
		<comments>http://blogs.law.harvard.edu/brandonhaynes/2009/06/17/downloads-commerce-server-upmmembershipprovider-and-dotnetnuke/#comments</comments>
		<pubDate>Wed, 17 Jun 2009 13:59:01 +0000</pubDate>
		<dc:creator>Brandon Haynes</dc:creator>
				<category><![CDATA[DotNetNuke (DNN) Content Management System]]></category>
		<category><![CDATA[Microsoft Commerce Server]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[Authentication]]></category>
		<category><![CDATA[Commerce Server]]></category>
		<category><![CDATA[Commerce Server 2007]]></category>
		<category><![CDATA[DotNetNuke]]></category>
		<category><![CDATA[UpmMembershipProvider]]></category>

		<guid isPermaLink="false">http://blogs.law.harvard.edu/brandonhaynes/?p=193</guid>
		<description><![CDATA[Slightly more than a year ago, I detailed the steps necessary to integrate Commerce Server 2007 &#8212; and specifically the UpmMembershipProvider membership subsystem &#8212; into the DotNetNuke web application framework.  This entry is located here: Using Commerce Server’s UpmMembershipProvider with DotNetNuke.
However, subsequent to my original posting detailing this approach, I experienced some IPR issues that required [...]]]></description>
			<content:encoded><![CDATA[<p>Slightly more than a year ago, I detailed the steps necessary to integrate <a href="http://www.microsoft.com/commerceserver">Commerce Server 2007</a> &#8212; and specifically the <a href="http://msdn.microsoft.com/en-us/library/microsoft.commerceserver.runtime.profiles.upmmembershipprovider.aspx">UpmMembershipProvider</a> membership subsystem &#8212; into the <a href="http://dotnetnuke.com">DotNetNuke web application framework</a>.  This entry is located here: <a title="Permanent link to Using Commerce Server’s UpmMembershipProvider with DotNetNuke" rel="bookmark" href="http://blogs.law.harvard.edu/brandonhaynes/2008/04/27/using-commerce-servers-upmmembershipprovider-with-dotnetnuke/">Using Commerce Server’s UpmMembershipProvider with DotNetNuke</a>.</p>
<p>However, subsequent to my original posting detailing this approach, I experienced some IPR issues that required my removing the download links to the actual assembly and source code.  While the information in the entry itself was largely sufficient to recreate this adapter, it required a reasonably significant amount of expertise to do so.  As a result, I suspect that many were unable to utilize the material therein.</p>
<p>I am pleased to announce that I have reached resolution on the relevant IPR issues that precluded my releasing the associated code, and have re-enabled the download links in the original post.  For convenience, I am also including them below.</p>
<p><span id="more-193"></span></p>
<p>For those not familiar with this project, the introduction from the original entry reads:</p>
<blockquote><p>&#8220;&#8230; [T]he UpmMembershipProvider membership provider, &#8230; is a part of Microsoft’s Commerce Server 2007 product, and is the only provider that offers interoperability with Commerce Server.  It replaces the older AuthManager functionality from Commerce Server 2002.  More importantly, it provides an implementation of the System.Web.Membership.MembershipProvider class, and may thus be used in any <a title="http://ASP. " href="http://asp.net/" target="_blank">ASP.NET</a> application that utilizes the standard membership system.  Read more about the UpmMembershipProvider in<a href="http://msdn2.microsoft.com/en-us/library/microsoft.commerceserver.runtime.profiles.upmmembershipprovider.aspx"><span>Microsoft’s MSDN documentation</span></a>.</p>
<p><a href="http://www.dotnetnuke.com/"><span>DotNetNuke</span></a> (DNN) is one such application that uses the <a title="http://ASP. " href="http://asp.net/" target="_blank">ASP.NET</a> membership system.  Because I’ve been working so much with it lately, I decided to investigate whether these two strangers might be successfully introduced — and indeed they can.  <a href="http://www.google.com/search?q=UpmMembershipProvider+DotNetNuke&amp;rls=com.microsoft:en-us&amp;ie=UTF-8&amp;oe=UTF-8&amp;startIndex=&amp;startPage=1"><span>Google</span></a> tells me that I am the only person to date who has successfully accomplished this task (not that surprising, given its relatively esoteric nature).</p></blockquote>
<h3>Attachments</h3>
<ul>
<li><a href="http://brandonhaynes.org/Downloads/UpmMembershipProvider/BrandonHaynes.Integration%20Web.Config%20for%20DNN%204.8.1.zip">Sample web.config for UpmMembershipAdapter and DotNetNuke</a></li>
<li><a href="http://brandonhaynes.org/Downloads/UpmMembershipProvider/BrandonHaynes.UpmMembershipProviderAdapter.zip">UpmMembershipProviderAdapter C# Project</a></li>
</ul>
<p>B</p>



Share on:


	<a rel="nofollow" id="digg" href="javascript:window.location='http%3A%2F%2Fdigg.com%2Fsubmit%3Fphase%3D2%26amp%3Burl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F06%252F17%252Fdownloads-commerce-server-upmmembershipprovider-and-dotnetnuke%252F%26amp%3Btitle%3DDownloads%253A%2520Commerce%2520Server%2520UpmMembershipProvider%2520and%2520DotNetNuke%26amp%3Bbodytext%3DSlightly%2520more%2520than%2520a%2520year%2520ago%252C%2520I%2520detailed%2520the%2520steps%2520necessary%2520to%2520integrate%2520Commerce%2520Server%25202007%2520--%2520and%2520specifically%2520the%2520UpmMembershipProvider%2520membership%2520subsystem%2520--%2520into%2520the%2520DotNetNuke%2520web%2520application%2520framework.%2520%25C2%25A0This%2520entry%2520is%2520located%2520here%253A%25C2%25A0Using%2520';" title="Digg"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow" id="del.icio.us" href="javascript:window.location='http%3A%2F%2Fdelicious.com%2Fpost%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F06%252F17%252Fdownloads-commerce-server-upmmembershipprovider-and-dotnetnuke%252F%26amp%3Btitle%3DDownloads%253A%2520Commerce%2520Server%2520UpmMembershipProvider%2520and%2520DotNetNuke%26amp%3Bnotes%3DSlightly%2520more%2520than%2520a%2520year%2520ago%252C%2520I%2520detailed%2520the%2520steps%2520necessary%2520to%2520integrate%2520Commerce%2520Server%25202007%2520--%2520and%2520specifically%2520the%2520UpmMembershipProvider%2520membership%2520subsystem%2520--%2520into%2520the%2520DotNetNuke%2520web%2520application%2520framework.%2520%25C2%25A0This%2520entry%2520is%2520located%2520here%253A%25C2%25A0Using%2520';" title="del.icio.us"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow" id="facebook" href="javascript:window.location='http%3A%2F%2Fwww.facebook.com%2Fshare.php%3Fu%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F06%252F17%252Fdownloads-commerce-server-upmmembershipprovider-and-dotnetnuke%252F%26amp%3Bt%3DDownloads%253A%2520Commerce%2520Server%2520UpmMembershipProvider%2520and%2520DotNetNuke';" title="Facebook"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow" id="google" href="javascript:window.location='http%3A%2F%2Fwww.google.com%2Fbookmarks%2Fmark%3Fop%3Dedit%26amp%3Bbkmk%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F06%252F17%252Fdownloads-commerce-server-upmmembershipprovider-and-dotnetnuke%252F%26amp%3Btitle%3DDownloads%253A%2520Commerce%2520Server%2520UpmMembershipProvider%2520and%2520DotNetNuke%26amp%3Bannotation%3DSlightly%2520more%2520than%2520a%2520year%2520ago%252C%2520I%2520detailed%2520the%2520steps%2520necessary%2520to%2520integrate%2520Commerce%2520Server%25202007%2520--%2520and%2520specifically%2520the%2520UpmMembershipProvider%2520membership%2520subsystem%2520--%2520into%2520the%2520DotNetNuke%2520web%2520application%2520framework.%2520%25C2%25A0This%2520entry%2520is%2520located%2520here%253A%25C2%25A0Using%2520';" title="Google Bookmarks"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow" id="dotnetkicks" href="javascript:window.location='http%3A%2F%2Fwww.dotnetkicks.com%2Fkick%2F%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F06%252F17%252Fdownloads-commerce-server-upmmembershipprovider-and-dotnetnuke%252F%26amp%3Btitle%3DDownloads%253A%2520Commerce%2520Server%2520UpmMembershipProvider%2520and%2520DotNetNuke';" title="DotNetKicks"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/dotnetkicks.png" title="DotNetKicks" alt="DotNetKicks" class="sociable-hovers" /></a>
	><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/linkedin.png" title="LinkedIn" alt="LinkedIn" class="sociable-hovers" /></a>
	<a rel="nofollow" id="stumbleupon" href="javascript:window.location='http%3A%2F%2Fwww.stumbleupon.com%2Fsubmit%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F06%252F17%252Fdownloads-commerce-server-upmmembershipprovider-and-dotnetnuke%252F%26amp%3Btitle%3DDownloads%253A%2520Commerce%2520Server%2520UpmMembershipProvider%2520and%2520DotNetNuke';" title="StumbleUpon"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/stumbleupon.png" title="StumbleUpon" alt="StumbleUpon" class="sociable-hovers" /></a>
	<a rel="nofollow" id="technorati" href="javascript:window.location='http%3A%2F%2Ftechnorati.com%2Ffaves%3Fadd%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F06%252F17%252Fdownloads-commerce-server-upmmembershipprovider-and-dotnetnuke%252F';" title="Technorati"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/technorati.png" title="Technorati" alt="Technorati" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://blogs.law.harvard.edu/brandonhaynes/2009/06/17/downloads-commerce-server-upmmembershipprovider-and-dotnetnuke/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-sa/3.0/us/</creativeCommons:license>
	</item>
		<item>
		<title>Presentation Materials: Advanced Authorization in DotNetNuke 5.1</title>
		<link>http://blogs.law.harvard.edu/brandonhaynes/2009/06/16/presentation-materials-advanced-authorization-in-dotnetnuke/</link>
		<comments>http://blogs.law.harvard.edu/brandonhaynes/2009/06/16/presentation-materials-advanced-authorization-in-dotnetnuke/#comments</comments>
		<pubDate>Tue, 16 Jun 2009 17:28:17 +0000</pubDate>
		<dc:creator>Brandon Haynes</dc:creator>
				<category><![CDATA[DotNetNuke (DNN) Content Management System]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[5.1]]></category>
		<category><![CDATA[Authorization]]></category>
		<category><![CDATA[DotNetNuke]]></category>
		<category><![CDATA[DotNetNuke 5.1]]></category>
		<category><![CDATA[Security]]></category>

		<guid isPermaLink="false">http://blogs.law.harvard.edu/brandonhaynes/?p=157</guid>
		<description><![CDATA[I recently had the privilege of presenting at the DoDNN conference on the topic of authorization theory and the new extension points available in DotNetNuke version 5.1.  This was an enjoyable session with great attendees and some interesting conversation afterwards.

The session abstract from this presentation read:
Among the many improvements present in DotNetNuke version 5.1, [...]]]></description>
			<content:encoded><![CDATA[<p>I recently had the privilege of presenting at the <a href="http://dayofdnn.com">DoDNN conference</a> on the topic of authorization theory and the new extension points available in DotNetNuke version 5.1.  This was an enjoyable session with great attendees and some interesting conversation afterwards.<br />
<span id="more-157"></span><br />
The session abstract from this presentation read:</p>
<blockquote><p>Among the many improvements present in DotNetNuke version 5.1, this latest release includes authorization as a first-class extension point.  This allows customization previously impossible without core modification.  Additionally, the permission model (and the internal use thereof) has been significantly streamlined and centralized, allowing for great flexibility across myriad use scenarios.</p>
<p>In this session, we explore the new permission provider in detail.  This includes a discussion of how (and why) authorization services were centralized and abstracted, the overall design and structure of the provider, and available points of access control.  Finally, we examine some concrete ways in which the provider might be extended to meet real-world policy requirements.</p></blockquote>
<div style="float: right;margin: 8px"><a href="http://blogs.law.harvard.edu/brandonhaynes/files/2009/06/amazon-s3-teaser.png" rel="lightbox[157]"><img class="alignnone size-medium wp-image-46" src="http://blogs.law.harvard.edu/brandonhaynes/files/2009/06/amazon-s3-teaser-300x167.png" alt="A screenshot demonstrating Amazon S3 cloud-based integration on the DotNetNuke platform" width="300" height="167" /></a></div>
<p>In accordance with some requests I&#8217;ve received, I am making the presentation materials available to the public.  These materials are available here: <a href="http://blogs.law.harvard.edu/brandonhaynes/files/2009/06/advanced-authorization-in-dotnetnuke.pdf">Advanced Authorization in DotNetNuke 5.1</a>.</p>
<div style="float: right;margin: 8px"><a href="http://blogs.law.harvard.edu/brandonhaynes/files/2009/06/amazon-s3-uri-teaser.png" rel="lightbox[157]"><img class="size-medium wp-image-172" src="http://blogs.law.harvard.edu/brandonhaynes/files/2009/06/amazon-s3-uri-teaser-294x300.png" alt="Amazon S3 Demonstration Displaying URI Selection" width="294" height="300" /></a></div>
<p>This presentation included a demonstration detailing how data and authorization provider decoration may be used to integrate the framework with Amazon S3 Services (screenshots of this in action are displayed right).  The code for this demonstration will be made available later this month on <a href="http://blogs.law.harvard.edu/brandonhaynes/2009/06/22/released-dotnetnuke-amazon-s3-folder-integration-providers/">its project homepage</a> at CodePlex.</p>
<p>B</p>
<p>Epilogue: The Amazon S3 Integration providers are now available for public consumption.</p>



Share on:


	<a rel="nofollow" id="digg" href="javascript:window.location='http%3A%2F%2Fdigg.com%2Fsubmit%3Fphase%3D2%26amp%3Burl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F06%252F16%252Fpresentation-materials-advanced-authorization-in-dotnetnuke%252F%26amp%3Btitle%3DPresentation%2520Materials%253A%2520Advanced%2520Authorization%2520in%2520DotNetNuke%25205.1%26amp%3Bbodytext%3DI%2520recently%2520had%2520the%2520privilege%2520of%2520presenting%2520at%2520the%2520DoDNN%2520conference%2520on%2520the%2520topic%2520of%2520authorization%2520theory%2520and%2520the%2520new%2520extension%2520points%2520available%2520in%2520DotNetNuke%2520version%25205.1.%2520%2520This%2520was%2520an%2520enjoyable%2520session%2520with%2520great%2520attendees%2520and%2520some%2520interesting%2520convers';" title="Digg"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow" id="del.icio.us" href="javascript:window.location='http%3A%2F%2Fdelicious.com%2Fpost%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F06%252F16%252Fpresentation-materials-advanced-authorization-in-dotnetnuke%252F%26amp%3Btitle%3DPresentation%2520Materials%253A%2520Advanced%2520Authorization%2520in%2520DotNetNuke%25205.1%26amp%3Bnotes%3DI%2520recently%2520had%2520the%2520privilege%2520of%2520presenting%2520at%2520the%2520DoDNN%2520conference%2520on%2520the%2520topic%2520of%2520authorization%2520theory%2520and%2520the%2520new%2520extension%2520points%2520available%2520in%2520DotNetNuke%2520version%25205.1.%2520%2520This%2520was%2520an%2520enjoyable%2520session%2520with%2520great%2520attendees%2520and%2520some%2520interesting%2520convers';" title="del.icio.us"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow" id="facebook" href="javascript:window.location='http%3A%2F%2Fwww.facebook.com%2Fshare.php%3Fu%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F06%252F16%252Fpresentation-materials-advanced-authorization-in-dotnetnuke%252F%26amp%3Bt%3DPresentation%2520Materials%253A%2520Advanced%2520Authorization%2520in%2520DotNetNuke%25205.1';" title="Facebook"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow" id="google" href="javascript:window.location='http%3A%2F%2Fwww.google.com%2Fbookmarks%2Fmark%3Fop%3Dedit%26amp%3Bbkmk%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F06%252F16%252Fpresentation-materials-advanced-authorization-in-dotnetnuke%252F%26amp%3Btitle%3DPresentation%2520Materials%253A%2520Advanced%2520Authorization%2520in%2520DotNetNuke%25205.1%26amp%3Bannotation%3DI%2520recently%2520had%2520the%2520privilege%2520of%2520presenting%2520at%2520the%2520DoDNN%2520conference%2520on%2520the%2520topic%2520of%2520authorization%2520theory%2520and%2520the%2520new%2520extension%2520points%2520available%2520in%2520DotNetNuke%2520version%25205.1.%2520%2520This%2520was%2520an%2520enjoyable%2520session%2520with%2520great%2520attendees%2520and%2520some%2520interesting%2520convers';" title="Google Bookmarks"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow" id="dotnetkicks" href="javascript:window.location='http%3A%2F%2Fwww.dotnetkicks.com%2Fkick%2F%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F06%252F16%252Fpresentation-materials-advanced-authorization-in-dotnetnuke%252F%26amp%3Btitle%3DPresentation%2520Materials%253A%2520Advanced%2520Authorization%2520in%2520DotNetNuke%25205.1';" title="DotNetKicks"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/dotnetkicks.png" title="DotNetKicks" alt="DotNetKicks" class="sociable-hovers" /></a>
	<a rel="nofollow" id="linkedin" href="javascript:window.location='http%3A%2F%2Fwww.linkedin.com%2FshareArticle%3Fmini%3Dtrue%26amp%3Burl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F06%252F16%252Fpresentation-materials-advanced-authorization-in-dotnetnuke%252F%26amp%3Btitle%3DPresentation%2520Materials%253A%2520Advanced%2520Authorization%2520in%2520DotNetNuke%25205.1%26amp%3Bsource%3DFrom%2Bthe%2BDesk%2Bof%2BBrandon%2BHaynes%2BObservations%2Babout%2Bthe%2Bintersection%2Bof%2Btechnology%252C%2Bbusiness%252C%2Band%2Bintellectual%2Bproperty%26amp%3Bsummary%3DI%2520recently%2520had%2520the%2520privilege%2520of%2520presenting%2520at%2520the%2520DoDNN%2520conference%2520on%2520the%2520topic%2520of%2520authorization%2520theory%2520and%2520the%2520new%2520extension%2520points%2520available%2520in%2520DotNetNuke%2520version%25205.1.%2520%2520This%2520was%2520an%2520enjoyable%2520session%2520with%2520great%2520attendees%2520and%2520some%2520interesting%2520convers';" title="LinkedIn"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/linkedin.png" title="LinkedIn" alt="LinkedIn" class="sociable-hovers" /></a>
	<a rel="nofollow" id="stumbleupon" href="javascript:window.location='http%3A%2F%2Fwww.stumbleupon.com%2Fsubmit%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F06%252F16%252Fpresentation-materials-advanced-authorization-in-dotnetnuke%252F%26amp%3Btitle%3DPresentation%2520Materials%253A%2520Advanced%2520Authorization%2520in%2520DotNetNuke%25205.1';" title="StumbleUpon"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/stumbleupon.png" title="StumbleUpon" alt="StumbleUpon" class="sociable-hovers" /></a>
	<a rel="nofollow" id="technorati" href="javascript:window.location='http%3A%2F%2Ftechnorati.com%2Ffaves%3Fadd%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F06%252F16%252Fpresentation-materials-advanced-authorization-in-dotnetnuke%252F';" title="Technorati"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/technorati.png" title="Technorati" alt="Technorati" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://blogs.law.harvard.edu/brandonhaynes/2009/06/16/presentation-materials-advanced-authorization-in-dotnetnuke/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-sa/3.0/us/</creativeCommons:license>
	</item>
		<item>
		<title>Preview: Amazon S3 Integration @ the DoDNN Conference</title>
		<link>http://blogs.law.harvard.edu/brandonhaynes/2009/06/08/preview-amazon-s3-integration-dodnn-conference/</link>
		<comments>http://blogs.law.harvard.edu/brandonhaynes/2009/06/08/preview-amazon-s3-integration-dodnn-conference/#comments</comments>
		<pubDate>Mon, 08 Jun 2009 13:07:01 +0000</pubDate>
		<dc:creator>Brandon Haynes</dc:creator>
				<category><![CDATA[DotNetNuke (DNN) Content Management System]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[5.1]]></category>
		<category><![CDATA[Authorization]]></category>
		<category><![CDATA[DotNetNuke]]></category>
		<category><![CDATA[DotNetNuke 5.1]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://blogs.law.harvard.edu/brandonhaynes/?p=132</guid>
		<description><![CDATA[As many are aware, I will be presenting a session at the upcoming Day of DotNetNuke conference in Orlando, Florida.  The session is entitled &#8220;The Cutting Edge: Advanced Authorization in DotNetNuke 5.1.&#8221;  The abstract for this session reads:
Among the many improvements present in DotNetNuke version 5.1, this latest release includes authorization as a first-class extension [...]]]></description>
			<content:encoded><![CDATA[<p>As many are aware, I will be presenting a session at the upcoming <a href="http://dayofdnn.com/">Day of DotNetNuke</a> conference in Orlando, Florida.  The session is entitled &#8220;<a href="http://dayofdnn.com/Sessions/tabid/214/CodecampId/1/SessionId/33/Default.aspx">The Cutting Edge: Advanced Authorization in DotNetNuke 5.1</a>.&#8221;  The abstract for this session reads:</p>
<blockquote><p>Among the many improvements present in DotNetNuke version 5.1, this latest release includes authorization as a first-class extension point.  This allows customization previously impossible without core modification.  Additionally, the permission model (and the internal use thereof) has been significantly streamlined and centralized, allowing for great flexibility across myriad use scenarios.</p>
<p>In this session, we explore the new permission provider in detail.  This includes a discussion of how (and why) authorization services were centralized and abstracted, the overall design and structure of the provider, and available points of access control.  Finally, we examine some concrete ways in which the provider might be extended to meet real-world policy requirements.</p></blockquote>
<p>When presenting architectural or theoretical material, I always strive to include a demonstration of how the material might be applied to a real-world scenario.  In this case, I will be demonstrating how a custom authorization provider can be used to enable full DotNetNuke integration with cloud-based <a href="http://aws.amazon.com/s3/">Amazon S3 webservices</a>.  A screenshot of the file manager in an Amazon S3-enabled installation is displayed below.</p>
<div style="float: right;margin: 8px"><a href="http://blogs.law.harvard.edu/brandonhaynes/files/2009/06/amazon-s3-teaser.png" rel="lightbox[132]"><img class="alignnone size-medium wp-image-46" src="http://blogs.law.harvard.edu/brandonhaynes/files/2009/06/amazon-s3-teaser-300x167.png" alt="A screenshot demonstrating Amazon S3 cloud-based integration on the DotNetNuke platform" width="300" height="167" /></a></div>
<p>This session should appeal to a wide audience; I cover enough theoretical background for individuals new to security theory, and delve deep enough into the 5.1 authorization architecture to satisfy those that have high familiarity with the platform.  If you are interested in learning more about the internals of the framework &#8212; and how 5.1 authorization might be utilized &#8212; be sure to stop by!</p>
<p>Epilogue: The presentation materials are now <a href="http://blogs.law.harvard.edu/brandonhaynes/2009/06/16/presentation-materials-advanced-authorization-in-dotnetnuke/">available here</a>, and the Amazon S3 Integration providers may be <a href="http://blogs.law.harvard.edu/brandonhaynes/2009/06/22/released-dotnetnuke-amazon-s3-folder-integration-providers/">found here</a>.</p>



Share on:


	<a rel="nofollow" id="digg" href="javascript:window.location='http%3A%2F%2Fdigg.com%2Fsubmit%3Fphase%3D2%26amp%3Burl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F06%252F08%252Fpreview-amazon-s3-integration-dodnn-conference%252F%26amp%3Btitle%3DPreview%253A%2520Amazon%2520S3%2520Integration%2520%2540%2520the%2520DoDNN%2520Conference%26amp%3Bbodytext%3DAs%2520many%2520are%2520aware%252C%2520I%2520will%2520be%2520presenting%2520a%2520session%2520at%2520the%2520upcoming%2520Day%2520of%2520DotNetNuke%2520conference%2520in%2520Orlando%252C%2520Florida.%2520%25C2%25A0The%2520session%2520is%2520entitled%2520%2522The%2520Cutting%2520Edge%253A%2520Advanced%2520Authorization%2520in%2520DotNetNuke%25205.1.%2522%2520%25C2%25A0The%2520abstract%2520for%2520this%2520session%2520reads%253A%250D%250AAmong%2520';" title="Digg"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow" id="del.icio.us" href="javascript:window.location='http%3A%2F%2Fdelicious.com%2Fpost%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F06%252F08%252Fpreview-amazon-s3-integration-dodnn-conference%252F%26amp%3Btitle%3DPreview%253A%2520Amazon%2520S3%2520Integration%2520%2540%2520the%2520DoDNN%2520Conference%26amp%3Bnotes%3DAs%2520many%2520are%2520aware%252C%2520I%2520will%2520be%2520presenting%2520a%2520session%2520at%2520the%2520upcoming%2520Day%2520of%2520DotNetNuke%2520conference%2520in%2520Orlando%252C%2520Florida.%2520%25C2%25A0The%2520session%2520is%2520entitled%2520%2522The%2520Cutting%2520Edge%253A%2520Advanced%2520Authorization%2520in%2520DotNetNuke%25205.1.%2522%2520%25C2%25A0The%2520abstract%2520for%2520this%2520session%2520reads%253A%250D%250AAmong%2520';" title="del.icio.us"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow" id="facebook" href="javascript:window.location='http%3A%2F%2Fwww.facebook.com%2Fshare.php%3Fu%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F06%252F08%252Fpreview-amazon-s3-integration-dodnn-conference%252F%26amp%3Bt%3DPreview%253A%2520Amazon%2520S3%2520Integration%2520%2540%2520the%2520DoDNN%2520Conference';" title="Facebook"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow" id="google" href="javascript:window.location='http%3A%2F%2Fwww.google.com%2Fbookmarks%2Fmark%3Fop%3Dedit%26amp%3Bbkmk%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F06%252F08%252Fpreview-amazon-s3-integration-dodnn-conference%252F%26amp%3Btitle%3DPreview%253A%2520Amazon%2520S3%2520Integration%2520%2540%2520the%2520DoDNN%2520Conference%26amp%3Bannotation%3DAs%2520many%2520are%2520aware%252C%2520I%2520will%2520be%2520presenting%2520a%2520session%2520at%2520the%2520upcoming%2520Day%2520of%2520DotNetNuke%2520conference%2520in%2520Orlando%252C%2520Florida.%2520%25C2%25A0The%2520session%2520is%2520entitled%2520%2522The%2520Cutting%2520Edge%253A%2520Advanced%2520Authorization%2520in%2520DotNetNuke%25205.1.%2522%2520%25C2%25A0The%2520abstract%2520for%2520this%2520session%2520reads%253A%250D%250AAmong%2520';" title="Google Bookmarks"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow" id="dotnetkicks" href="javascript:window.location='http%3A%2F%2Fwww.dotnetkicks.com%2Fkick%2F%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F06%252F08%252Fpreview-amazon-s3-integration-dodnn-conference%252F%26amp%3Btitle%3DPreview%253A%2520Amazon%2520S3%2520Integration%2520%2540%2520the%2520DoDNN%2520Conference';" title="DotNetKicks"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/dotnetkicks.png" title="DotNetKicks" alt="DotNetKicks" class="sociable-hovers" /></a>
	<img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/linkedin.png" title="LinkedIn" alt="LinkedIn" class="sociable-hovers" /></a>
	<a rel="nofollow" id="stumbleupon" href="javascript:window.location='http%3A%2F%2Fwww.stumbleupon.com%2Fsubmit%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F06%252F08%252Fpreview-amazon-s3-integration-dodnn-conference%252F%26amp%3Btitle%3DPreview%253A%2520Amazon%2520S3%2520Integration%2520%2540%2520the%2520DoDNN%2520Conference';" title="StumbleUpon"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/stumbleupon.png" title="StumbleUpon" alt="StumbleUpon" class="sociable-hovers" /></a>
	<a rel="nofollow" id="technorati" href="javascript:window.location='http%3A%2F%2Ftechnorati.com%2Ffaves%3Fadd%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F06%252F08%252Fpreview-amazon-s3-integration-dodnn-conference%252F';" title="Technorati"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/technorati.png" title="Technorati" alt="Technorati" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://blogs.law.harvard.edu/brandonhaynes/2009/06/08/preview-amazon-s3-integration-dodnn-conference/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-sa/3.0/us/</creativeCommons:license>
	</item>
		<item>
		<title>Released: DotNetNuke Templated Mega-Menu Provider</title>
		<link>http://blogs.law.harvard.edu/brandonhaynes/2009/05/31/released-dotnetnuke-templated-mega-menu-provider/</link>
		<comments>http://blogs.law.harvard.edu/brandonhaynes/2009/05/31/released-dotnetnuke-templated-mega-menu-provider/#comments</comments>
		<pubDate>Mon, 01 Jun 2009 02:33:54 +0000</pubDate>
		<dc:creator>Brandon Haynes</dc:creator>
				<category><![CDATA[DotNetNuke (DNN) Content Management System]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[DotNetNuke]]></category>
		<category><![CDATA[Menuing]]></category>
		<category><![CDATA[Provider]]></category>
		<category><![CDATA[Template]]></category>
		<category><![CDATA[User Interface]]></category>

		<guid isPermaLink="false">http://blogs.law.harvard.edu/brandonhaynes/?p=115</guid>
		<description><![CDATA[
I am pleased to announce the 1.00.00 release of a new templated mega-menu provider.   It is based on, and derives its functionality from, the default DNNMenu.

The provider allows for the marking of one or more pages as being templated; during instantiation these templates are dynamically inserted into the page.  The templates are [...]]]></description>
			<content:encoded><![CDATA[<div style="float: right"><a href="http://blogs.law.harvard.edu/brandonhaynes/files/2009/04/dnnmegamenunavigationproviderdescriptionssmaller.png" rel="lightbox[115]"><img class="alignnone size-medium wp-image-46" src="http://blogs.law.harvard.edu/brandonhaynes/files/2009/04/dnnmegamenunavigationproviderdescriptionssmaller-300x284.png" alt="A screenshot of the prototype DotNetnuke DNNMenu Mega-Menu Navigation Provider" width="300" height="284" /></a></div>
<p>I am pleased to announce the <a href="http://dnntemplatedmenu.codeplex.com/">1.00.00 release</a> of a new templated mega-menu provider.   It is based on, and derives its functionality from, the default DNNMenu.<br />
<span id="more-115"></span><br />
The provider allows for the marking of one or more pages as being templated; during instantiation these templates are dynamically inserted into the page.  The templates are highly flexible and may be deployed at the site, skin, or portal level.  This allows for great flexibility in user experience.</p>
<p><!--more--></p>
<h2>Goals</h2>
<ul>
<li>Allow website administrators to select from one or more pre-defined menu templates for any page</li>
<li>Allow templates to be deployed at the installation, portal, and skin level</li>
<li>Allow specification of both rendered HTML and CSS file attachment on a per-page basis</li>
<li>Allow templates to be fully search engine friendly and utilize modern XHTML and CSS design</li>
<li>Rely on default DNNMenu implementation for all other behavior</li>
<li>Require no core changes and utilize only existing DotNetNuke extension points</li>
</ul>
<h2>Background</h2>
<p>The DotNetNuke content management system is a mature, robust, and widely-adopted web application framework. While the framework allows for the use of myriad menu systems (through the application of the provider pattern), to date there is no way to effectuate per-page templated (&#8221;mega&#8221;) menus.</p>
<p>This project attempts to bridge that gap by extending the DotNetNuke-default DNNMenu system to render custom templates in place of any node in the menu hierarchy. These templates are easy to create and extend, and allow for a wide variety of final user experiences. Several such templates are included out-of-the-box, demonstrating the flexibility of this provider extension. For maximum flexibility, templates may be deployed by a host across an entire installation, provided as a part of a skinning package, or deployed on a per-portal basis.</p>
<h3>What this project is&#8230;</h3>
<p>This project is a derivative of the popular and DotNetNuke-included DNNMenu system included with the DotNetNuke Webcontrols project. All the functionality present in that menu system may be utilized by using this provider.</p>
<h3>What this project is not&#8230;</h3>
<p>This project is NOT a new menu system for DotNetNuke. It merely extends a small part of the functionality that already exists in the DNNMenu system. Although it is very likely that this method may be used to extend other menu providers (I have already verified this with the Telerik&#8217;s RadMenu), it does not yet do so.</p>
<p>If any developer wishes to extend the method used herein to any other popular DotNetNuke navigation provider and would be interested in donating the code to the project, it would be greatly appreciated.</p>
<h4>More Information</h4>
<p>For more information about this provider, including additional screenshots, please visit the <a href="http://dnntemplatedmenu.codeplex.com/">project homepage</a> (<a href="http://dnntemplatedmenu.codeplex.com/">http://dnntemplatedmenu.codeplex.com</a>) located on CodePlex.  The software itself is licensed under a liberal New BSD license for wide community utilization.</p>



Share on:


	<a rel="nofollow" id="digg" href="javascript:window.location='http%3A%2F%2Fdigg.com%2Fsubmit%3Fphase%3D2%26amp%3Burl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F05%252F31%252Freleased-dotnetnuke-templated-mega-menu-provider%252F%26amp%3Btitle%3DReleased%253A%2520DotNetNuke%2520Templated%2520Mega-Menu%2520Provider%26amp%3Bbodytext%3D%250D%250AI%2520am%2520pleased%2520to%2520announce%2520the%25201.00.00%2520release%2520of%2520a%2520new%2520templated%2520mega-menu%2520provider.%2520%2520%2520It%2520is%2520based%2520on%252C%2520and%2520derives%2520its%2520functionality%2520from%252C%2520the%2520default%2520DNNMenu.%250D%250A%250D%250AThe%2520provider%2520allows%2520for%2520the%2520marking%2520of%2520one%2520or%2520more%2520pages%2520as%2520being%2520templated%253B%2520during%2520in';" title="Digg"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow" id="del.icio.us" href="javascript:window.location='http%3A%2F%2Fdelicious.com%2Fpost%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F05%252F31%252Freleased-dotnetnuke-templated-mega-menu-provider%252F%26amp%3Btitle%3DReleased%253A%2520DotNetNuke%2520Templated%2520Mega-Menu%2520Provider%26amp%3Bnotes%3D%250D%250AI%2520am%2520pleased%2520to%2520announce%2520the%25201.00.00%2520release%2520of%2520a%2520new%2520templated%2520mega-menu%2520provider.%2520%2520%2520It%2520is%2520based%2520on%252C%2520and%2520derives%2520its%2520functionality%2520from%252C%2520the%2520default%2520DNNMenu.%250D%250A%250D%250AThe%2520provider%2520allows%2520for%2520the%2520marking%2520of%2520one%2520or%2520more%2520pages%2520as%2520being%2520templated%253B%2520during%2520in';" title="del.icio.us"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow" id="facebook" href="javascript:window.location='http%3A%2F%2Fwww.facebook.com%2Fshare.php%3Fu%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F05%252F31%252Freleased-dotnetnuke-templated-mega-menu-provider%252F%26amp%3Bt%3DReleased%253A%2520DotNetNuke%2520Templated%2520Mega-Menu%2520Provider';" title="Facebook"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow" id="google" href="javascript:window.location='http%3A%2F%2Fwww.google.com%2Fbookmarks%2Fmark%3Fop%3Dedit%26amp%3Bbkmk%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F05%252F31%252Freleased-dotnetnuke-templated-mega-menu-provider%252F%26amp%3Btitle%3DReleased%253A%2520DotNetNuke%2520Templated%2520Mega-Menu%2520Provider%26amp%3Bannotation%3D%250D%250AI%2520am%2520pleased%2520to%2520announce%2520the%25201.00.00%2520release%2520of%2520a%2520new%2520templated%2520mega-menu%2520provider.%2520%2520%2520It%2520is%2520based%2520on%252C%2520and%2520derives%2520its%2520functionality%2520from%252C%2520the%2520default%2520DNNMenu.%250D%250A%250D%250AThe%2520provider%2520allows%2520for%2520the%2520marking%2520of%2520one%2520or%2520more%2520pages%2520as%2520being%2520templated%253B%2520during%2520in';" title="Google Bookmarks"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow" id="dotnetkicks" href="javascript:window.location='http%3A%2F%2Fwww.dotnetkicks.com%2Fkick%2F%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F05%252F31%252Freleased-dotnetnuke-templated-mega-menu-provider%252F%26amp%3Btitle%3DReleased%253A%2520DotNetNuke%2520Templated%2520Mega-Menu%2520Provider';" title="DotNetKicks"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/dotnetkicks.png" title="DotNetKicks" alt="DotNetKicks" class="sociable-hovers" /></a>
	<img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/linkedin.png" title="LinkedIn" alt="LinkedIn" class="sociable-hovers" /></a>
	<a rel="nofollow" id="stumbleupon" href="javascript:window.location='http%3A%2F%2Fwww.stumbleupon.com%2Fsubmit%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F05%252F31%252Freleased-dotnetnuke-templated-mega-menu-provider%252F%26amp%3Btitle%3DReleased%253A%2520DotNetNuke%2520Templated%2520Mega-Menu%2520Provider';" title="StumbleUpon"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/stumbleupon.png" title="StumbleUpon" alt="StumbleUpon" class="sociable-hovers" /></a>
	<a rel="nofollow" id="technorati" href="javascript:window.location='http%3A%2F%2Ftechnorati.com%2Ffaves%3Fadd%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F05%252F31%252Freleased-dotnetnuke-templated-mega-menu-provider%252F';" title="Technorati"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/technorati.png" title="Technorati" alt="Technorati" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://blogs.law.harvard.edu/brandonhaynes/2009/05/31/released-dotnetnuke-templated-mega-menu-provider/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-sa/3.0/us/</creativeCommons:license>
	</item>
		<item>
		<title>Public Preview: DotNetNuke Templated Mega-Menu Provider</title>
		<link>http://blogs.law.harvard.edu/brandonhaynes/2009/05/14/public-preview-dotnetnuke-templated-mega-menu-provider/</link>
		<comments>http://blogs.law.harvard.edu/brandonhaynes/2009/05/14/public-preview-dotnetnuke-templated-mega-menu-provider/#comments</comments>
		<pubDate>Thu, 14 May 2009 14:11:41 +0000</pubDate>
		<dc:creator>Brandon Haynes</dc:creator>
				<category><![CDATA[DotNetNuke (DNN) Content Management System]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[DotNetNuke]]></category>

		<guid isPermaLink="false">http://blogs.law.harvard.edu/brandonhaynes/?p=85</guid>
		<description><![CDATA[I am pleased to announce the publically-available preview of a new templated mega-menu provider.  This preview is for internal evaluation only, and should not be used in production.  A full release, including source, is expected at the end of the month.
The provider allows for marking one or more pages as being templated; during instantiation these templates are dynamically [...]]]></description>
			<content:encoded><![CDATA[<p>I am pleased to announce the <a href="http://dnntemplatedmenu.codeplex.com/">publically-available preview</a> of a new templated mega-menu provider.  This preview is for internal evaluation only, and should not be used in production.  A full release, including source, is expected at the end of the month.</p>
<p>The provider allows for marking one or more pages as being templated; during instantiation these templates are dynamically inserted into the page.  The templates are highly flexible and may be deployed at the site, skin, or portal level.  This allows for great flexibility in user experience.</p>
<p>The project is hosted on CodePlex and is <a href="http://dnntemplatedmenu.codeplex.com/">located here</a>.</p>
<p>By way of example, the default templates available allows styling of the DotNetNuke administrator menu as:</p>
<div>
<div id="attachment_47" class="wp-caption alignleft" style="width: 310px"><img class="size-medium wp-image-47" src="http://blogs.law.harvard.edu/brandonhaynes/files/2009/04/dnnmegamenunavigationproviderwide-300x197.png" alt="DotNetNuke DNNMenu Templated-Menu Provider Screenshot with Wide Rendering" width="300" height="197" /><p class="wp-caption-text">DotNetNuke DNNMenu Templated-Menu Provider Screenshot with Wide Rendering</p></div>
</div>
<p><span id="more-85"></span></p>
<div>
<div id="attachment_46" class="wp-caption alignright" style="width: 310px"><img class="size-medium wp-image-46" src="http://blogs.law.harvard.edu/brandonhaynes/files/2009/04/dnnmegamenunavigationprovider-300x201.png" alt="A screenshot of the prototype DotNetnuke DNNMenu Templated-Menu Navigation Provider" width="300" height="201" /><p class="wp-caption-text">A screenshot of the prototype DotNetnuke DNNMenu Templated-Menu Navigation Provider</p></div>
</div>
<p>As always, feedback is greatly appreciated!</p>
<p>B</p>



Share on:


	<a rel="nofollow" id="digg" href="javascript:window.location='http%3A%2F%2Fdigg.com%2Fsubmit%3Fphase%3D2%26amp%3Burl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F05%252F14%252Fpublic-preview-dotnetnuke-templated-mega-menu-provider%252F%26amp%3Btitle%3DPublic%2520Preview%253A%2520DotNetNuke%2520Templated%2520Mega-Menu%2520Provider%26amp%3Bbodytext%3DI%2520am%2520pleased%2520to%2520announce%2520the%25C2%25A0publically-available%2520preview%25C2%25A0of%2520a%2520new%2520templated%2520mega-menu%2520provider.%2520%25C2%25A0This%2520preview%2520is%2520for%2520internal%2520evaluation%2520only%252C%2520and%2520should%2520not%2520be%2520used%2520in%2520production.%2520%25C2%25A0A%25C2%25A0full%2520release%252C%2520including%2520source%252C%2520is%2520expected%2520at%2520the%2520end%2520of%2520th';" title="Digg"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow" id="del.icio.us" href="javascript:window.location='http%3A%2F%2Fdelicious.com%2Fpost%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F05%252F14%252Fpublic-preview-dotnetnuke-templated-mega-menu-provider%252F%26amp%3Btitle%3DPublic%2520Preview%253A%2520DotNetNuke%2520Templated%2520Mega-Menu%2520Provider%26amp%3Bnotes%3DI%2520am%2520pleased%2520to%2520announce%2520the%25C2%25A0publically-available%2520preview%25C2%25A0of%2520a%2520new%2520templated%2520mega-menu%2520provider.%2520%25C2%25A0This%2520preview%2520is%2520for%2520internal%2520evaluation%2520only%252C%2520and%2520should%2520not%2520be%2520used%2520in%2520production.%2520%25C2%25A0A%25C2%25A0full%2520release%252C%2520including%2520source%252C%2520is%2520expected%2520at%2520the%2520end%2520of%2520th';" title="del.icio.us"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow" id="facebook" href="javascript:window.location='http%3A%2F%2Fwww.facebook.com%2Fshare.php%3Fu%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F05%252F14%252Fpublic-preview-dotnetnuke-templated-mega-menu-provider%252F%26amp%3Bt%3DPublic%2520Preview%253A%2520DotNetNuke%2520Templated%2520Mega-Menu%2520Provider';" title="Facebook"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow" id="google" href="javascript:window.location='http%3A%2F%2Fwww.google.com%2Fbookmarks%2Fmark%3Fop%3Dedit%26amp%3Bbkmk%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F05%252F14%252Fpublic-preview-dotnetnuke-templated-mega-menu-provider%252F%26amp%3Btitle%3DPublic%2520Preview%253A%2520DotNetNuke%2520Templated%2520Mega-Menu%2520Provider%26amp%3Bannotation%3DI%2520am%2520pleased%2520to%2520announce%2520the%25C2%25A0publically-available%2520preview%25C2%25A0of%2520a%2520new%2520templated%2520mega-menu%2520provider.%2520%25C2%25A0This%2520preview%2520is%2520for%2520internal%2520evaluation%2520only%252C%2520and%2520should%2520not%2520be%2520used%2520in%2520production.%2520%25C2%25A0A%25C2%25A0full%2520release%252C%2520including%2520source%252C%2520is%2520expected%2520at%2520the%2520end%2520of%2520th';" title="Google Bookmarks"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow" id="dotnetkicks" href="javascript:window.location='http%3A%2F%2Fwww.dotnetkicks.com%2Fkick%2F%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F05%252F14%252Fpublic-preview-dotnetnuke-templated-mega-menu-provider%252F%26amp%3Btitle%3DPublic%2520Preview%253A%2520DotNetNuke%2520Templated%2520Mega-Menu%2520Provider';" title="DotNetKicks"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/dotnetkicks.png" title="DotNetKicks" alt="DotNetKicks" class="sociable-hovers" /></a>
	<img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/linkedin.png" title="LinkedIn" alt="LinkedIn" class="sociable-hovers" /></a>
	<a rel="nofollow" id="stumbleupon" href="javascript:window.location='http%3A%2F%2Fwww.stumbleupon.com%2Fsubmit%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F05%252F14%252Fpublic-preview-dotnetnuke-templated-mega-menu-provider%252F%26amp%3Btitle%3DPublic%2520Preview%253A%2520DotNetNuke%2520Templated%2520Mega-Menu%2520Provider';" title="StumbleUpon"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/stumbleupon.png" title="StumbleUpon" alt="StumbleUpon" class="sociable-hovers" /></a>
	<a rel="nofollow" id="technorati" href="javascript:window.location='http%3A%2F%2Ftechnorati.com%2Ffaves%3Fadd%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F05%252F14%252Fpublic-preview-dotnetnuke-templated-mega-menu-provider%252F';" title="Technorati"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/technorati.png" title="Technorati" alt="Technorati" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://blogs.law.harvard.edu/brandonhaynes/2009/05/14/public-preview-dotnetnuke-templated-mega-menu-provider/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-sa/3.0/us/</creativeCommons:license>
	</item>
		<item>
		<title>DotNetNuke Multi-Factor Authentication Provider</title>
		<link>http://blogs.law.harvard.edu/brandonhaynes/2009/05/01/dotnetnuke-multi-factor-authentication-provider/</link>
		<comments>http://blogs.law.harvard.edu/brandonhaynes/2009/05/01/dotnetnuke-multi-factor-authentication-provider/#comments</comments>
		<pubDate>Fri, 01 May 2009 12:05:08 +0000</pubDate>
		<dc:creator>Brandon Haynes</dc:creator>
				<category><![CDATA[DotNetNuke (DNN) Content Management System]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Authentication]]></category>
		<category><![CDATA[DotNetNuke]]></category>
		<category><![CDATA[Security]]></category>

		<guid isPermaLink="false">http://blogs.law.harvard.edu/brandonhaynes/?p=50</guid>
		<description><![CDATA[

I am pleased to announce an initial release of a multi-factor provider for the DotNetNuke content management system.
This authentication provider allows a host to configure enhanced authentication (including SMS, SMTP, YubiKey, and X.509 certificates) for any number and combination of portal roles. Each factor must be fulfilled prior to authentication being granted, increasing overall security.
This [...]]]></description>
			<content:encoded><![CDATA[<div style="float: right">
<div id="attachment_49" class="wp-caption alignright" style="width: 160px"> <a href="http://blogs.law.harvard.edu/brandonhaynes/files/2009/04/multifactoronetimeandcertificate.png" rel="lightbox[50]"><img class="size-thumbnail wp-image-49" src="http://blogs.law.harvard.edu/brandonhaynes/files/2009/04/multifactoronetime-150x150.png" alt="DotNetNuke Multifactor Authentication Requiring Password, One-Time SMS PIN, and X.509 Certificate" width="150" height="150" /></a><p class="wp-caption-text">DotNetNuke Multifactor Authentication Requiring Password, One-Time SMS PIN, and X.509 Certificate</p></div>
</div>
<p>I am pleased to announce an initial release of a multi-factor provider for the DotNetNuke content management system.</p>
<p>This authentication provider allows a host to configure enhanced authentication (including SMS, SMTP, YubiKey, and X.509 certificates) for any number and combination of portal roles. Each factor must be fulfilled prior to authentication being granted, increasing overall security.</p>
<p>This package may be downloaded from it&#8217;s project site, located at <a href="http://dnnmultifactor.codeplex.com">http://dnnmultifactor.codeplex.com</a>.</p>
<h2>Goals</h2>
<ul>
<li>A robust, extensible multi-factor authentication framework for the DotNetNuke content management system.</li>
<li>Complete integration into the framework using existing extension points, with no core modifications or recompilation required.</li>
<li>Support for host-, administrator-, and user-level configuration, with the ability to vary required factors across an arbitrary set of roles.</li>
<li>A robust set of included factor providers, including SMS, secure SMTP, YubiKey (<a class="externalLink" href="http://www.yubico.com/">www.yubico.com</a>), and X.509 certificate.</li>
<li>Extension points in the authentication system allowing for development of custom factors by third parties.</li>
<li>Reliance on the existing&nbsp;<a href="http://ASP.NET" title="http://ASP. " target="_blank">ASP.NET</a> membership subsystem for existing (first-factor) authentication.</li>
<li>Minimization of &#8220;custom security&#8221; risk by relying, insofar as is possible, upon existing security infrastructure &nbsp;<a href="http://ASP.NET" title="http://ASP.(" target="_blank">ASP.NET</a> membership, DotNetNuke portal security, password generation, et cetera.</li>
<li>As small an overall surface area as is possible, and an absolute reliance upon the existing&nbsp;<a href="http://ASP.NET" title="http://ASP. " target="_blank">ASP.NET</a> membership system as a first-factor fallback, should any unforeseen vulnerability exist.</li>
</ul>
<h2><span id="more-50"></span></h2>
<h2>Background</h2>
<p>The <a class="externalLink" href="http://www.dotnetnuke.com/">DotNetNuke content management system</a> is a mature, robust, and widely-adopted web application framework. It offers role-based authentication and authorization using the <a class="externalLink" href="http://msdn.microsoft.com/en-us/library/yh26yfzy.aspx">ASP.NET membership subsystem</a>, and allows for multiplexing across any number of websites per installation. Read more about DotNetNuke security-related functionality <a class="externalLink" href="http://www.dotnetnuke.com/Products/DotNetNuke/Security/tabid/1230/Default.aspx">on their website</a>.</p>
<div style="float:right">
<div id="attachment_49" class="wp-caption alignright" style="width: 160px"><a href="http://blogs.law.harvard.edu/brandonhaynes/files/2009/04/multifactoronetime.png" rel="lightbox[50]"><img class="size-thumbnail wp-image-49" src="http://blogs.law.harvard.edu/brandonhaynes/files/2009/04/multifactoronetime-150x150.png" alt="DotNetNuke Multifactor Authentication Requiring Password and One-Time SMS PIN" width="150" height="150" /></a><p class="wp-caption-text">DotNetNuke Multifactor Authentication Requiring Password and One-Time SMS PIN</p></div>
</div>
<p>However, DotNetNuke does not offer an out-of-the-box multi-factor authentication story. This is especially unfortunate, especially as the platform is more widely relied upon as a line-of-business portal for enterprise-scale applications such as high-volume e-commerce and banking. These applications, along with the fact that the platform offers cross-website &#8220;host&#8221; accounts, require a higher-than-normal level of authentication than a simple username/password combination is able to offer.</p>
<p>This project attempts to bridge that gap by extending existing DotNetNuke functionality to offer multi-factor authentication to those roles, users, and hosts configured to require it. Available factors include, in addition to the first-factor&nbsp;<a href="http://ASP.NET" title="http://ASP. " target="_blank">ASP.NET</a> membership subsystem (which is always required), SMS, secure SMTP, and X.509 certificate-based authentication. The package is designed to be flexible and easily extended, allowing any arbitrary additional factors to be introduced by third-party developers.</p>
<h2>Usage</h2>
<p>This authentication extension has been designed for, tested against, and requires DotNetNuke version 5.0.1 or later. Details about core installation and the downloads therefor, are located <a class="externalLink" href="http://www.dotnetnuke.com/tabid/125/default.aspx">on the DotNetNuke website</a>.</p>
<h4>Installation instructions</h4>
<ol>
<li>Download the <a class="externalLink" href="http://dnnmultifactor.codeplex.com/Release/ProjectReleases.aspx">latest release</a>.</li>
<li><a href="http://www.mitchelsellers.com/Blogs/tabid/54/articleType/ArticleView/articleId/33/Default.aspx" target="_blank">Backup all data</a> associated with your installation, including both files and database.</li>
<li>Sign in as a host account.</li>
<li>The default configuration is designed, for demonstration purposes, to enable a SMTP factor for host accounts. Ensure that your installation has specified <a href="http://www.mitchelsellers.com/blogs/articletype/articleview/articleid/189/dotnetnuke-host-settings-explained.aspx">valid SMTP settings</a> and that your host account has been configured with an active e-mail account.</li>
<li>Install the authentication extension via the Host-&gt;Extensions menu option.</li>
<li>After installation, visit your site&#8217;s login page (after logging out of your host account) to ensure the provider is functioning properly.</li>
<li>Configure your web.config to select those factors and roles you wish to augment with additional security (see below).</li>
<li>When satisfied with your ultimate configuration, disable the default DotNetNuke authentication system through the Host-&gt;Extensions-&gt;Default Authentication menu option.</li>
</ol>
<h2>Configuration</h2>
<p>The DotNetNuke multi-factor authentication provider currently requires modification to the web.config file when specifying those roles that are to be authenticated with additional factors. This may be changed in the future and effectuated through the settings page.</p>
<p>The default addition to the installation&#8217;s web.config file includes a node located at <span class="codeInline">configuration/brandonHaynes</span>. It is here that the factors &#8212; and the roles that map thereto &#8212; are defined:</p>
<div>
<pre><span>&lt;</span><span>brandonHaynes</span><span>&gt;</span>
  <span>&lt;</span><span>authenticationFactors</span><span>&gt;</span>
    <span>&lt;</span><span>factor</span> <span>name</span><span>=</span><span>"</span><span>Membership</span><span>"</span> <span>type</span><span>=</span><span>"</span><span>BrandonHaynes.Membership.Factors.MembershipFactor...</span><span>"</span> <span>/&gt;</span>
    <span>&lt;</span><span>factor</span> <span>name</span><span>=</span><span>"</span><span>SMTP</span><span>"</span> <span>text</span><span>=</span><span>"</span><span>Enter your one-time password:</span><span>"</span>
        <span>type</span><span>=</span><span>"</span><span>BrandonHaynes.Membership.Factors.SmtpFactor...</span><span>"</span> <span>/&gt;</span>
    <span>&lt;</span><span>factor</span> <span>name</span><span>=</span><span>"</span><span>SMS</span><span>"</span> <span>appId</span><span>=</span><span>"</span><span>3165534</span><span>"</span> <span>userName</span><span>=</span><span>"</span><span>...</span><span>"</span> <span>password</span><span>=</span><span>"</span><span>...</span><span>"</span>
        <span>text</span><span>=</span><span>"</span><span>Enter your one-time password:</span><span>"</span>
        <span>type</span><span>=</span><span>"</span><span>BrandonHaynes.Membership.Factors.SMSFactor...</span><span>"</span> <span>/&gt;</span>
    <span>&lt;</span><span>factor</span> <span>name</span><span>=</span><span>"</span><span>X.509</span><span>"</span> <span>text</span><span>=</span><span>"</span><span>A valid certificate is required to access this account.</span><span>"</span>
        <span>type</span><span>=</span><span>"</span><span>BrandonHaynes.Membership.Factors.ClientCertificateFactor...</span><span>"</span> <span>/&gt;</span>
      <span>&lt;</span><span>factor</span> <span>name</span><span>=</span><span>"</span><span>YubiKey</span><span>"</span> <span>text</span><span>=</span><span>"</span><span>Activate your YubiKey now:</span><span>"</span> <span>id</span><span>=</span><span>"</span><span>...</span><span>"</span> <span>key</span><span>=</span><span>"</span><span>...</span><span>"</span>
        <span>type</span><span>=</span><span>"</span><span>BrandonHaynes.Membership.MultifactorMembershipProvider...</span><span>"</span> <span>/&gt;</span>
  <span>&lt;/</span><span>authenticationFactors</span><span>&gt;</span>
  <span>&lt;</span><span>authenticationMap</span><span>&gt;</span>
    <span>&lt;</span><span>role</span> <span>name</span><span>=</span><span>"</span><span>host</span><span>"</span><span>&gt;</span>
      <span>&lt;</span><span>factor</span> <span>name</span><span>=</span><span>"</span><span>YubiKey</span><span>"</span> <span>/&gt;</span>
    <span>&lt;/</span><span>role</span><span>&gt;</span>
    <span>&lt;</span><span>role</span> <span>name</span><span>=</span><span>"</span><span>Administrators</span><span>"</span><span>&gt;</span>
      <span>&lt;</span><span>factor</span> <span>name</span><span>=</span><span>"</span><span>SMS</span><span>"</span> <span>/&gt;</span>
    <span>&lt;/</span><span>role</span><span>&gt;</span>
  <span>&lt;/</span><span>authenticationMap</span><span>&gt;</span>
<span>&lt;/</span><span>brandonHaynes</span><span>&gt;</span></pre>
</div>
<p>Here, we have five factors defined &nbsp;<a href="http://ASP.NET" title="http://ASP.(" target="_blank">ASP.NET</a> membership, SMTP, SMS, YubiKey, and X.509 certificate) as children of the <span class="codeInline">brandonHaynes/authenticationFactors</span> node. Additional factors may be defined therein.</p>
<p>Under the <span class="codeInline">brandonHaynes/authenticationMap</span> node, we map roles to factors. In the example above, the host role requires a valid YubiKey one-time password and those in an administrator role requires a SMS-dispatched one-time-password. Additional roles and factors may be added (or removed) to enable virtually any configuration. Note that, regardless of configuration, the&nbsp;<a href="http://ASP.NET" title="http://ASP. " target="_blank">ASP.NET</a> membership factor is <strong>always</strong> required.</p>
<h2>Factors Included in this Distribution</h2>
<p>The following factors are included in this distribution:</p>
<ul>
<li>SMS. This factor utilizes the <a class="externalLink" href="http://clickatell.com/">Clickatell</a> SMS gateway for secure one-time password delivery. Factor configuration requires account id and password; this may be encrypted for additional protection (see <a class="externalLink" href="http://msdn.microsoft.com/en-us/library/dtkwfdky.aspx">this</a> for details).</li>
<li>X.509. This factor utilizes the certificate presented by the client when making an authentication decision. The factor utilizes the built-in&nbsp;<a href="http://ASP.NET" title="http://ASP. " target="_blank">ASP.NET</a> subsystem (which, itself, relies upon IIS) in making decisions related to the presence and validity of a client certificate. Assuming both, the certificate subject is compared to a (configurable) user property (by default the username). Alternate profile properties may be used as a basis for comparison by including a <span class="codeInline">profileProperty</span> attribute in the factor definition. For example, to compare a user&#8217;s e-mail address, configure the factor as:</li>
</ul>
<div>
<pre>    <span>&lt;</span><span>factor</span> <span>name</span><span>=</span><span>"</span><span>X.509</span><span>"</span> <span>profileProperty</span><span>=</span><span>"</span><span>email</span><span>"</span> <span>text</span><span>=</span><span>"</span><span>...</span><span>"</span>
         <span>type</span><span>=</span><span>"</span><span>BrandonHaynes.Membership.Factors.ClientCertificateFactor...</span><span>"</span> <span>/&gt;</span></pre>
</div>
<ul>
<li>SMTP. This factor utilizes the SMTP server configured for the current DotNetNuke website for transmission of one-time password. Though these settings may be configured to transmit this information securely, in most situations this configuration should not be relied upon for true out-of-band one-time-password transmission (an exception might exist for delivery to a SMS or handheld device external to the authenticating computer system).</li>
<li>YubiKey. This factor requires activation of a valid YubiKey (<a class="externalLink" href="http://www.yubico.com/">www.yubico.com</a>) to authenticate. By default, the factor authenticates against<a class="externalLink" href="https://api.yubico.com/wsapi/verify">https://api.yubico.com/wsapi/verify</a>, but this may be changed by including a verifyUri attribute on the factor node. Note that by default if no YubiKey is associated with an authenticating account, it will be associated upon first use. Subsequent authentication requires the same YubiKey to be presented. This feature may be deactivated with an associateOnFirstUse=&#8221;false&#8221; attribute. Note that if automatic association is disabled, accounts requiring YubiKey authentication must be manually associated (by a host). If possible, it is a good idea to disable automatic association after all accounts have associated for the first time.</li>
</ul>
<h2>Custom Factors</h2>
<p>This authentication provider is designed to be highly extensible and to allow for additional factors to be added with relative ease. Developers may deploy their own factors by:</p>
<ul>
<li>Including a constructor having the prototype of the form:</li>
</ul>
<div>
<pre style="padding-left: 60px">MyFactor(IDictionary&lt;<span>string</span>, <span>string</span>&gt; attributes);</pre>
</div>
<ul>
<li>Implementing the BrandonHaynes.Membership.IAuthenticationFactor interface, defined as:</li>
</ul>
<div>
<pre style="padding-left: 60px"><span>public</span> <span>interface</span><span> IAuthenticationFactor
	</span>{
	<span>string</span> Name { <span>get</span>; }
	<span>void</span> Authenticate(UserInfo user, Credential credential);
	Control PromptControl { <span>get</span>; }
	}</pre>
</div>
<p style="padding-left: 30px">Note that the PromptControl property above is a control that handles the input of whatever additional credential (one-time-password or otherwise) is desired. Three are provided for use in custom development:</p>
<ol style="padding-left: 60px">
<li><span class="codeInline">MessagePrompt</span> (to display a simple message),</li>
<li><span class="codeInline">StringPrompt</span> (to input a one-time-password), and</li>
<li><span class="codeInline">NullPrompt</span> (does not display or require any additional input).</li>
</ol>
<p style="padding-left: 30px">Though any control may be used here, note that because of the way they are instantiated, much of the control life cycle is omitted (in particular ViewState and automatic IPostBackDataHandler handling is not activated). These controls must remain as simple as possible.</p>
<h3>Custom SMS Gateways</h3>
<p>The SMS factor is designed to be extendable and allow for integration with alternate SMS gateway providers. This may be effectuated by deriving from <span class="codeInline">BrandonHaynes.Membership.SmsFactor</span> and overriding one or more of the following methods:</p>
<div>
<pre><span>// Override this method to send a specific one-time password to a telephone </span>
<span>// number for a particular user using whatever custom SMS gateway is desired.</span>
<span>protected</span> <span>void</span> SendSms(UserInfo user, <span>string</span> telephone, <span>string</span> onetimePassword);</pre>
</div>
<div>
<pre><span>// Override this method to format a given telephone number for transmission to a </span>
<span>// custom SMS gateway service.  Note that the default implementation is </span>
<span>// (unfortunately) US-centric and does not perform a robust E.164 formatting (code </span>
<span>// submissions for this facet would be greatly appreciated!).  </span>
<span>string</span> FormatTelephoneByCountry(UserInfo user, <span>string</span> telephone);</pre>
</div>
<h2>In Case of Emergency&#8230;</h2>
<p>As with any authentication system, any failure that might occur has a high risk of locking a host out of his or her account. As such, I strongly recommend deploying this package to a staging server prior to production deployment, along with other reasonable precautions.</p>
<p>Should an unrecoverable lockout occur, please note that the default DotNetNuke authentication system may be re-enabled through modification to the dbo.Authentication table of your database. The following SQL will effectuate this (and at the same time disable all other authentication systems that might be available). Use it as an emergency escape.</p>
<div>
<pre><span>UPDATE</span> dbo.Authentication
<span>SET</span> IsEnabled =
	<span>CASE</span> <span>WHEN</span> AuthenticationType = <span>'DNN'</span> <span>THEN</span> 1 <span>ELSE</span> 0 <span>END</span></pre>
</div>
<p>Note that you will need to recycle your application pool to realize this change; this may be most easily effectuated by recycling your IIS application pool, restarting IIS, or by making any change to your web.config file (thanks to <a href="http://www.mitchelsellers.com/blogs.aspx">Mitchel Sellers</a> for pointing out this oversight!).</p>
<h2>Feedback Appreciated!</h2>
<p>Feedback about your experiences is needed, and <span style="text-decoration: underline">greatly</span> appreciated!</p>



Share on:


	<a rel="nofollow" id="digg" href="javascript:window.location='http%3A%2F%2Fdigg.com%2Fsubmit%3Fphase%3D2%26amp%3Burl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F05%252F01%252Fdotnetnuke-multi-factor-authentication-provider%252F%26amp%3Btitle%3DDotNetNuke%2520Multi-Factor%2520Authentication%2520Provider%26amp%3Bbodytext%3D%250D%250A%250D%250A%250D%250A%250D%250AI%2520am%2520pleased%2520to%2520announce%2520an%2520initial%2520release%2520of%2520a%2520multi-factor%2520provider%2520for%2520the%2520DotNetNuke%2520content%2520management%2520system.%250D%250A%250D%250AThis%2520authentication%2520provider%2520allows%2520a%2520host%2520to%2520configure%2520enhanced%2520authentication%2520%2528including%2520SMS%252C%2520SMTP%252C%2520YubiKey%252C%2520and%2520X.509%2520c';" title="Digg"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow" id="del.icio.us" href="javascript:window.location='http%3A%2F%2Fdelicious.com%2Fpost%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F05%252F01%252Fdotnetnuke-multi-factor-authentication-provider%252F%26amp%3Btitle%3DDotNetNuke%2520Multi-Factor%2520Authentication%2520Provider%26amp%3Bnotes%3D%250D%250A%250D%250A%250D%250A%250D%250AI%2520am%2520pleased%2520to%2520announce%2520an%2520initial%2520release%2520of%2520a%2520multi-factor%2520provider%2520for%2520the%2520DotNetNuke%2520content%2520management%2520system.%250D%250A%250D%250AThis%2520authentication%2520provider%2520allows%2520a%2520host%2520to%2520configure%2520enhanced%2520authentication%2520%2528including%2520SMS%252C%2520SMTP%252C%2520YubiKey%252C%2520and%2520X.509%2520c';" title="del.icio.us"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow" id="facebook" href="javascript:window.location='http%3A%2F%2Fwww.facebook.com%2Fshare.php%3Fu%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F05%252F01%252Fdotnetnuke-multi-factor-authentication-provider%252F%26amp%3Bt%3DDotNetNuke%2520Multi-Factor%2520Authentication%2520Provider';" title="Facebook"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow" id="google" href="javascript:window.location='http%3A%2F%2Fwww.google.com%2Fbookmarks%2Fmark%3Fop%3Dedit%26amp%3Bbkmk%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F05%252F01%252Fdotnetnuke-multi-factor-authentication-provider%252F%26amp%3Btitle%3DDotNetNuke%2520Multi-Factor%2520Authentication%2520Provider%26amp%3Bannotation%3D%250D%250A%250D%250A%250D%250A%250D%250AI%2520am%2520pleased%2520to%2520announce%2520an%2520initial%2520release%2520of%2520a%2520multi-factor%2520provider%2520for%2520the%2520DotNetNuke%2520content%2520management%2520system.%250D%250A%250D%250AThis%2520authentication%2520provider%2520allows%2520a%2520host%2520to%2520configure%2520enhanced%2520authentication%2520%2528including%2520SMS%252C%2520SMTP%252C%2520YubiKey%252C%2520and%2520X.509%2520c';" title="Google Bookmarks"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow" id="dotnetkicks" href="javascript:window.location='http%3A%2F%2Fwww.dotnetkicks.com%2Fkick%2F%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F05%252F01%252Fdotnetnuke-multi-factor-authentication-provider%252F%26amp%3Btitle%3DDotNetNuke%2520Multi-Factor%2520Authentication%2520Provider';" title="DotNetKicks"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/dotnetkicks.png" title="DotNetKicks" alt="DotNetKicks" class="sociable-hovers" /></a>
	<a rel="nofollow" id="linkedin" href="javascript:window.location='http%3A%2F%2Fwww.linkedin.com%2FshareArticle%3Fmini%3Dtrue%26amp%3Burl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F05%252F01%252Fdotnetnuke-multi-factor-authentication-provider%252F%26amp%3Btitle%3DDotNetNuke%2520Multi-Factor%2520Authentication%2520Provider%26amp%3Bsource%3DFrom%2Bthe%2BDesk%2Bof%2BBrandon%2BHaynes%2BObservations%2Babout%2Bthe%2Bintersection%2Bof%2Btechnology%252C%2Bbusiness%252C%2Band%2Bintellectual%2Bproperty%26amp%3Bsummary%3D%250D%250A%250D%250A%250D%250A%250D%250AI%2520am%2520pleased%2520to%2520announce%2520an%2520initial%2520release%2520of%2520a%2520multi-factor%2520provider%2520for%2520the%2520DotNetNuke%2520content%2520management%2520system.%250D%250A%250D%250AThis%2520authentication%2520provider%2520allows%2520a%2520host%2520to%2520configure%2520enhanced%2520authentication%2520%2528including%2520SMS%252C%2520SMTP%252C%2520YubiKey%252C%2520and%2520X.509%2520c';" title="LinkedIn"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/linkedin.png" title="LinkedIn" alt="LinkedIn" class="sociable-hovers" /></a>
	<a rel="nofollow" id="stumbleupon" href="javascript:window.location='http%3A%2F%2Fwww.stumbleupon.com%2Fsubmit%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F05%252F01%252Fdotnetnuke-multi-factor-authentication-provider%252F%26amp%3Btitle%3DDotNetNuke%2520Multi-Factor%2520Authentication%2520Provider';" title="StumbleUpon"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/stumbleupon.png" title="StumbleUpon" alt="StumbleUpon" class="sociable-hovers" /></a>
	<a rel="nofollow" id="technorati" href="javascript:window.location='http%3A%2F%2Ftechnorati.com%2Ffaves%3Fadd%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F05%252F01%252Fdotnetnuke-multi-factor-authentication-provider%252F';" title="Technorati"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/technorati.png" title="Technorati" alt="Technorati" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://blogs.law.harvard.edu/brandonhaynes/2009/05/01/dotnetnuke-multi-factor-authentication-provider/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-sa/3.0/us/</creativeCommons:license>
	</item>
		<item>
		<title>DotNetNuke Debugging with Debug-Build Assemblies (4.9.2 and 5.0.1 Update)</title>
		<link>http://blogs.law.harvard.edu/brandonhaynes/2009/03/11/dotnetnuke-debugging-with-debug-build-assemblies-492-and-501-update/</link>
		<comments>http://blogs.law.harvard.edu/brandonhaynes/2009/03/11/dotnetnuke-debugging-with-debug-build-assemblies-492-and-501-update/#comments</comments>
		<pubDate>Wed, 11 Mar 2009 15:57:40 +0000</pubDate>
		<dc:creator>Brandon Haynes</dc:creator>
				<category><![CDATA[DotNetNuke (DNN) Content Management System]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Debugging]]></category>
		<category><![CDATA[DotNetNuke]]></category>

		<guid isPermaLink="false">http://blogs.law.harvard.edu/brandonhaynes/?p=40</guid>
		<description><![CDATA[I have, for some time, been maintaining debug-build versions of the standard DotNetNuke releases.  The debugging symbols contained in these assemblies make some types of problems easier to diagnose (see this for a detailed discussion).
To date, a number of people have successfully used these builds in correcting a number of reasonably arcane problems.  As such (and after some [...]]]></description>
			<content:encoded><![CDATA[<p>I have, for some time, been maintaining debug-build versions of the standard DotNetNuke releases.  The debugging symbols contained in these assemblies make some types of problems easier to diagnose (see <a href="http://blogs.law.harvard.edu/brandonhaynes/2008/07/21/debugging-difficult-exceptions-in-dotnetnuke/"><span><span><span style="text-decoration: none">this</span></span></span></a> for a detailed discussion).</p>
<p><span>To date, a number of people have successfully used these builds in correcting a number of reasonably arcane problems.  As such (and after some delay), I have elected to deploy debug-build version of the core DNN assemblies for the recently-released 4.9.2 and 5.0.1 version.</span></p>
<p>Please see <a href="http://blogs.law.harvard.edu/brandonhaynes/2008/07/21/enhanced-dotnetnuke-debugging-with-debug-build-assemblies-updated-for-49/"><span style="text-decoration: none">this entry</span></a> for downloads and usage patterns for these versions.</p>



Share on:


	<a rel="nofollow" id="digg" href="javascript:window.location='http%3A%2F%2Fdigg.com%2Fsubmit%3Fphase%3D2%26amp%3Burl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F03%252F11%252Fdotnetnuke-debugging-with-debug-build-assemblies-492-and-501-update%252F%26amp%3Btitle%3DDotNetNuke%2520Debugging%2520with%2520Debug-Build%2520Assemblies%2520%25284.9.2%2520and%25205.0.1%2520Update%2529%26amp%3Bbodytext%3DI%2520have%252C%2520for%2520some%2520time%252C%2520been%2520maintaining%2520debug-build%2520versions%2520of%2520the%2520standard%2520DotNetNuke%2520releases.%2520%25C2%25A0The%2520debugging%2520symbols%2520contained%2520in%2520these%2520assemblies%2520make%2520some%2520types%2520of%2520problems%2520easier%2520to%2520diagnose%25C2%25A0%2528see%25C2%25A0this%25C2%25A0for%2520a%2520detailed%2520discussion%2529.%250D%250A%250D%250ATo%2520date';" title="Digg"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow" id="del.icio.us" href="javascript:window.location='http%3A%2F%2Fdelicious.com%2Fpost%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F03%252F11%252Fdotnetnuke-debugging-with-debug-build-assemblies-492-and-501-update%252F%26amp%3Btitle%3DDotNetNuke%2520Debugging%2520with%2520Debug-Build%2520Assemblies%2520%25284.9.2%2520and%25205.0.1%2520Update%2529%26amp%3Bnotes%3DI%2520have%252C%2520for%2520some%2520time%252C%2520been%2520maintaining%2520debug-build%2520versions%2520of%2520the%2520standard%2520DotNetNuke%2520releases.%2520%25C2%25A0The%2520debugging%2520symbols%2520contained%2520in%2520these%2520assemblies%2520make%2520some%2520types%2520of%2520problems%2520easier%2520to%2520diagnose%25C2%25A0%2528see%25C2%25A0this%25C2%25A0for%2520a%2520detailed%2520discussion%2529.%250D%250A%250D%250ATo%2520date';" title="del.icio.us"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow" id="facebook" href="javascript:window.location='http%3A%2F%2Fwww.facebook.com%2Fshare.php%3Fu%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F03%252F11%252Fdotnetnuke-debugging-with-debug-build-assemblies-492-and-501-update%252F%26amp%3Bt%3DDotNetNuke%2520Debugging%2520with%2520Debug-Build%2520Assemblies%2520%25284.9.2%2520and%25205.0.1%2520Update%2529';" title="Facebook"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow" id="google" href="javascript:window.location='http%3A%2F%2Fwww.google.com%2Fbookmarks%2Fmark%3Fop%3Dedit%26amp%3Bbkmk%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F03%252F11%252Fdotnetnuke-debugging-with-debug-build-assemblies-492-and-501-update%252F%26amp%3Btitle%3DDotNetNuke%2520Debugging%2520with%2520Debug-Build%2520Assemblies%2520%25284.9.2%2520and%25205.0.1%2520Update%2529%26amp%3Bannotation%3DI%2520have%252C%2520for%2520some%2520time%252C%2520been%2520maintaining%2520debug-build%2520versions%2520of%2520the%2520standard%2520DotNetNuke%2520releases.%2520%25C2%25A0The%2520debugging%2520symbols%2520contained%2520in%2520these%2520assemblies%2520make%2520some%2520types%2520of%2520problems%2520easier%2520to%2520diagnose%25C2%25A0%2528see%25C2%25A0this%25C2%25A0for%2520a%2520detailed%2520discussion%2529.%250D%250A%250D%250ATo%2520date';" title="Google Bookmarks"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow" id="dotnetkicks" href="javascript:window.location='http%3A%2F%2Fwww.dotnetkicks.com%2Fkick%2F%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F03%252F11%252Fdotnetnuke-debugging-with-debug-build-assemblies-492-and-501-update%252F%26amp%3Btitle%3DDotNetNuke%2520Debugging%2520with%2520Debug-Build%2520Assemblies%2520%25284.9.2%2520and%25205.0.1%2520Update%2529';" title="DotNetKicks"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/dotnetkicks.png" title="DotNetKicks" alt="DotNetKicks" class="sociable-hovers" /></a>
	<img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/linkedin.png" title="LinkedIn" alt="LinkedIn" class="sociable-hovers" /></a>
	<a rel="nofollow" id="stumbleupon" href="javascript:window.location='http%3A%2F%2Fwww.stumbleupon.com%2Fsubmit%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F03%252F11%252Fdotnetnuke-debugging-with-debug-build-assemblies-492-and-501-update%252F%26amp%3Btitle%3DDotNetNuke%2520Debugging%2520with%2520Debug-Build%2520Assemblies%2520%25284.9.2%2520and%25205.0.1%2520Update%2529';" title="StumbleUpon"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/stumbleupon.png" title="StumbleUpon" alt="StumbleUpon" class="sociable-hovers" /></a>
	<a rel="nofollow" id="technorati" href="javascript:window.location='http%3A%2F%2Ftechnorati.com%2Ffaves%3Fadd%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F03%252F11%252Fdotnetnuke-debugging-with-debug-build-assemblies-492-and-501-update%252F';" title="Technorati"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/technorati.png" title="Technorati" alt="Technorati" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://blogs.law.harvard.edu/brandonhaynes/2009/03/11/dotnetnuke-debugging-with-debug-build-assemblies-492-and-501-update/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-sa/3.0/us/</creativeCommons:license>
	</item>
		<item>
		<title>Using the Entity Framework (LINQ to Entity) to IDataReader Adapter</title>
		<link>http://blogs.law.harvard.edu/brandonhaynes/2009/02/18/using-the-entity-framework-to-idatareader-adapter/</link>
		<comments>http://blogs.law.harvard.edu/brandonhaynes/2009/02/18/using-the-entity-framework-to-idatareader-adapter/#comments</comments>
		<pubDate>Wed, 18 Feb 2009 17:35:37 +0000</pubDate>
		<dc:creator>Brandon Haynes</dc:creator>
				<category><![CDATA[Entity Framework (EF)]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Entity Framework]]></category>
		<category><![CDATA[Linq]]></category>
		<category><![CDATA[Linq to Entities]]></category>

		<guid isPermaLink="false">http://blogs.law.harvard.edu/brandonhaynes/?p=37</guid>
		<description><![CDATA[In a recent article, I developed a theoretical basis for an adapter that allows for the adaptation of Entity Framework (EF) entities into IDataReader-implementing form, and announced the preview availability of this software. 
Herein I describe with more specificity the use of the adapter generator and the resultant adapters, and announce the release of the first production-ready [...]]]></description>
			<content:encoded><![CDATA[<p>In a <a href="http://blogs.law.harvard.edu/brandonhaynes/2008/12/14/entity-framework-to-idatareader-adapter/">recent article</a>, I developed a theoretical basis for an adapter that allows for the adaptation of Entity Framework (EF) entities into IDataReader-implementing form, and announced the <a href="http://www.codeplex.com/L2EDataReaderAdapter">preview availability</a> of this software. </p>
<p>Herein I describe with more specificity the use of the adapter generator and the resultant adapters, and announce the release of the first <a href="http://www.codeplex.com/L2EDataReaderAdapter">production-ready version</a> of the adapter generator software.</p>
<p><span id="more-37"></span></p>
<p>To introduce the use of the IDataReaderAdapter generator, consider a hypothetical software package with a data-layer defined as:</p>
<div style="border: dashed 1px black;padding: 0.5em;margin-left: 1em"><code>public interface IDataLayer<br />
    {<br />
    IDataReader GetSomeData();<br />
    IDataReader GetSomeOtherData(int aParameter);<br />
    }</code></div>
<p>Business-process code interacts with this data logic exclusively through the IDataLayer interface; this not only creates a clean <a href="http://en.wikipedia.org/wiki/Separation_of_concerns">separation of concerns</a>, but also allows for run-time specification of arbitrary IDataLayer implementation (typically a la <a href="http://en.wikipedia.org/wiki/Dependency_injection">dependency injection</a>).  This might be concretely implemented as:</p>
<div style="border: dashed 1px black;padding: 0.5em;margin-left: 1em"><code>public class DataLayer : IDataLayer<br />
    {<br />
    public IDataReader GetSomeData()<br />
        {<br />
        return SqlHelper.ExecuteReader(connectionString, "GetSomeData");<br />
        }</code><code><br />
    public IDataReader GetSomeOtherData(int aParameter)<br />
        {<br />
        return SqlHelper.ExecuteReader(connectionString, "GetSomeOtherData", aParameter);<br />
        }<br />
    }</code></div>
<p>For those developers wishing to move to Microsoft&#8217;s <a href="http://msdn.microsoft.com/en-us/library/aa697427(VS.80).aspx">Entity Framework</a> (EF), this presents a problem.  There is no ready method by which one may convert an <a href="http://msdn.microsoft.com/en-us/library/system.data.objects.dataclasses.entityobject.aspx">EntityObject</a> into an IDataRecord (and, similarly, an IEnumerable&lt;EntityObject&gt; into IDataReader).  Without such a conversion, it is not possible to transition to the EF without breaking the IDataLayer interface contract.  For those applications that are widely deployed (or have strong third-party augmentation), this is a very real problem indeed.</p>
<p>The IDataReaderAdapter generator allows for such a conversion in two ways:</p>
<ol>
<li>Compile-time adaption an EF schema into a set of IDataRecord-implementing wrappers <span style="text-decoration: underline">without</span> the use of reflection (and of O(n) property-lookup performance), or</li>
<li>Run-time adaption of an EntityObject (or any) object to an IDataRecord-implementing counterpart through the use of reflection.</li>
</ol>
<div>Developers are free to choose the method of adaption based upon his or her particular needs.</div>
<p><strong>Note:</strong> The adapter generator may be used to adapt <span style="text-decoration: underline">any</span> objects into IDataRecord/Reader-implementing objects.  Though the functionality described herein largely deals with the EF, the generator may be applied against any arbitrary object.</p>
<h4>Method 1: Compile-Time Adaption of an Entity Framework Schema</h4>
<p>To produce IDataRecord/Reader-implementing adapters at compile-time, we execute the adapter generator utility and point it at our EF schema.  The utility is executed in one of two ways, with syntax as:</p>
<p><code>IDataReaderAdapterGenerator<br />
        /entities:[.NET Entity Framework EDMX file]<br />
        /output:[output class filename]<br />
        [/entities:[entity regex]<br />
        [/language:vb|c#]</code></p>
<p><code>IDataReaderAdapterGenerator<br />
        /assembly:[source assembly filename]<br />
        /output:[output class filename]<br />
        [/objects:[entity regex]<br />
        [/language:vb|c#]</code></p>
<ul>
<li><strong>Entities/Assembly</strong>: Here, the first parameter may either be an EF Entity Data Model XML (EDMX) file or an arbitrary assembly.  The adapter generator will, assuming the former, parse the EDMX, extract entity objects, and create adapters.  If an assembly is specified, adapters are generated for each publicly-exposed object in that assembly.</li>
<li><strong>Output</strong>: This parameter specifies the output file for the generated adapters (i.e.; &#8220;Samples.cs&#8221; or &#8220;Samples.vb&#8221;).</li>
<li><strong>Entities/Objects</strong>: This setting specifies the particular entities or objects that are adapted.  This is specified as a regular expression (to adapt all entities or objects containing the word &#8220;Data&#8221; one would use the pattern &#8220;.*Data.*&#8221;).  By default, all available objects are adapted.</li>
<li><strong>Language</strong>: This allows specification of the target language for the generated adapters, either&nbsp;<a href="http://VB.NET" title="http://VB. " target="_blank">VB.NET</a> or C#.</li>
</ul>
<h4>Method #2: Run-time Adaption of Objects</h4>
<p>As an alternative to compile-time generation of IDataRecord/Reader-implementing objects, arbitrary objects may also be adapted at run-time.  Note, however, that this flexibility is achieved at the expense of the additional overhead required for the reflection used during access.  Consider this cost carefully &#8212; it is likely that compile-time adaption should be utilized wherever possible.</p>
<h4>Utilizing IDataRecord/Reader Adapters</h4>
<p>Irrespective of the method selected above, the resultant adapters are used in much the same manner.  By way of example, consider the data model that would result when the concrete DataLayer above were converted to utilize the EF.  This model would likely contain two entities, SomeData and SomeOtherData, and would be structured as follows:</p>
<p><a href="http://blogs.law.harvard.edu/brandonhaynes/files/2009/02/sample-data-model.jpg" rel="lightbox[37]"><img class="aligncenter size-medium wp-image-38" src="http://blogs.law.harvard.edu/brandonhaynes/files/2009/02/sample-data-model-300x212.jpg" alt="" width="300" height="212" /></a></p>
<p>If this EDMX existed in a file named SampleDataModel.edmx, we would adapt the model as:</p>
<p><code>IDataReaderAdapterGenerator /entities:SampleDataModel.edmx /output:AdaptedSample.cs</code></p>
<p>And we would implement our modern IDataLayer-implementing layer as:</p>
<div style="border: dashed 1px black;padding: 0.5em;margin-left: 1em"><code>using BrandonHaynes.Data;public class ModernDataLayer : IDataLayer<br />
    {<br />
    // Expose our entity model for new code to access<br />
    public ObjectContext EntityModel<br />
        { get { return new SampleDataModel()); }    public IDataReader GetSomeData()  </p>
<p>        {<br />
        using(var context = new SampleDataModel())<br />
            return new DataReaders.SomeDataDataReader(context.SomeData);<br />
        }</p>
<p></code><code>    public IDataReader GetSomeOtherData(int aParameter)<br />
        {<br />
        using(var context = new SampleDataModel())<br />
            return new DataReaders.SomeOtherDataDataReader(context.SomeOtherData<br />
                .Where(someOtherData =&gt; someOtherData.id == aParameter));<br />
        }<br />
    }</code></p>
</div>
<p>Note the use of BrandonHaynes.Data.DataReaders.SomeDataDataReader and BrandonHaynes.Data.DataReaders.SomeOtherDataDataReader to adapt returned EntityObjects (context.SomeData and context.SomeOtherData.Where(&#8230;)) into IDataReader-implementing interfaces.</p>
<p>To adapt objects at run-time using reflection, we would substitute these per-object adapters with the use of BrandonHaynes.Data.ReflectedDataReaderAdapter (or ReflectedDataRecordAdapter).  This would, for example, read as:</p>
<p><code>   return new ReflectedDataReaderAdapter(context.SomeData);</code></p>
<h4>Conclusion</h4>
<p>Herein we described the command-line use of the IDataReader Adapter generation tool to produce IDataRecord and IDataReader-adapting objects.  These objects may be used to modernize provider-based data layers that heavily rely on these interfaces, without breaking the existing contract. </p>
<p>The <a href="http://www.codeplex.com/L2EDataReaderAdapter">project site</a>, in addition to the source for both generators, includes two samples that should be reviewed by those interested in implementing these techniques in a production environment.  The first includes a sample model similar to that described herein, while the second includes a sample DotNetNuke data provider.  We will revisit this latter sample in subsequent entries as we explore advanced applications of the generated objects.</p>
<p>This entry will be followed by an exploration in more detail of the actual generated IDataReader and IDataRecord-adapting objects, including a review of the actual generated code.  For compile-time generated objects property conversion is performed in O(n) time with the mere addition of a constant-time hash (and lazy-loaded initialization).</p>
<p>As always, comments and feedback are greatly appreciated.</p>
<p>B</p>



Share on:


	<a rel="nofollow" id="digg" href="javascript:window.location='http%3A%2F%2Fdigg.com%2Fsubmit%3Fphase%3D2%26amp%3Burl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F02%252F18%252Fusing-the-entity-framework-to-idatareader-adapter%252F%26amp%3Btitle%3DUsing%2520the%2520Entity%2520Framework%2520%2528LINQ%2520to%2520Entity%2529%2520to%2520IDataReader%2520Adapter%26amp%3Bbodytext%3DIn%2520a%2520recent%2520article%252C%2520I%2520developed%2520a%2520theoretical%2520basis%2520for%2520an%2520adapter%2520that%2520allows%2520for%2520the%2520adaptation%2520of%2520Entity%2520Framework%2520%2528EF%2529%2520entities%2520into%2520IDataReader-implementing%2520form%252C%2520and%2520announced%2520the%2520preview%2520availability%2520of%2520this%2520software.%25C2%25A0%250D%250A%250D%250AHerein%2520I%2520describe%2520w';" title="Digg"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow" id="del.icio.us" href="javascript:window.location='http%3A%2F%2Fdelicious.com%2Fpost%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F02%252F18%252Fusing-the-entity-framework-to-idatareader-adapter%252F%26amp%3Btitle%3DUsing%2520the%2520Entity%2520Framework%2520%2528LINQ%2520to%2520Entity%2529%2520to%2520IDataReader%2520Adapter%26amp%3Bnotes%3DIn%2520a%2520recent%2520article%252C%2520I%2520developed%2520a%2520theoretical%2520basis%2520for%2520an%2520adapter%2520that%2520allows%2520for%2520the%2520adaptation%2520of%2520Entity%2520Framework%2520%2528EF%2529%2520entities%2520into%2520IDataReader-implementing%2520form%252C%2520and%2520announced%2520the%2520preview%2520availability%2520of%2520this%2520software.%25C2%25A0%250D%250A%250D%250AHerein%2520I%2520describe%2520w';" title="del.icio.us"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow" id="facebook" href="javascript:window.location='http%3A%2F%2Fwww.facebook.com%2Fshare.php%3Fu%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F02%252F18%252Fusing-the-entity-framework-to-idatareader-adapter%252F%26amp%3Bt%3DUsing%2520the%2520Entity%2520Framework%2520%2528LINQ%2520to%2520Entity%2529%2520to%2520IDataReader%2520Adapter';" title="Facebook"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow" id="google" href="javascript:window.location='http%3A%2F%2Fwww.google.com%2Fbookmarks%2Fmark%3Fop%3Dedit%26amp%3Bbkmk%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F02%252F18%252Fusing-the-entity-framework-to-idatareader-adapter%252F%26amp%3Btitle%3DUsing%2520the%2520Entity%2520Framework%2520%2528LINQ%2520to%2520Entity%2529%2520to%2520IDataReader%2520Adapter%26amp%3Bannotation%3DIn%2520a%2520recent%2520article%252C%2520I%2520developed%2520a%2520theoretical%2520basis%2520for%2520an%2520adapter%2520that%2520allows%2520for%2520the%2520adaptation%2520of%2520Entity%2520Framework%2520%2528EF%2529%2520entities%2520into%2520IDataReader-implementing%2520form%252C%2520and%2520announced%2520the%2520preview%2520availability%2520of%2520this%2520software.%25C2%25A0%250D%250A%250D%250AHerein%2520I%2520describe%2520w';" title="Google Bookmarks"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow" id="dotnetkicks" href="javascript:window.location='http%3A%2F%2Fwww.dotnetkicks.com%2Fkick%2F%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F02%252F18%252Fusing-the-entity-framework-to-idatareader-adapter%252F%26amp%3Btitle%3DUsing%2520the%2520Entity%2520Framework%2520%2528LINQ%2520to%2520Entity%2529%2520to%2520IDataReader%2520Adapter';" title="DotNetKicks"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/dotnetkicks.png" title="DotNetKicks" alt="DotNetKicks" class="sociable-hovers" /></a>
	<img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/linkedin.png" title="LinkedIn" alt="LinkedIn" class="sociable-hovers" /></a>
	<a rel="nofollow" id="stumbleupon" href="javascript:window.location='http%3A%2F%2Fwww.stumbleupon.com%2Fsubmit%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F02%252F18%252Fusing-the-entity-framework-to-idatareader-adapter%252F%26amp%3Btitle%3DUsing%2520the%2520Entity%2520Framework%2520%2528LINQ%2520to%2520Entity%2529%2520to%2520IDataReader%2520Adapter';" title="StumbleUpon"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/stumbleupon.png" title="StumbleUpon" alt="StumbleUpon" class="sociable-hovers" /></a>
	<a rel="nofollow" id="technorati" href="javascript:window.location='http%3A%2F%2Ftechnorati.com%2Ffaves%3Fadd%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2009%252F02%252F18%252Fusing-the-entity-framework-to-idatareader-adapter%252F';" title="Technorati"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/technorati.png" title="Technorati" alt="Technorati" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://blogs.law.harvard.edu/brandonhaynes/2009/02/18/using-the-entity-framework-to-idatareader-adapter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-sa/3.0/us/</creativeCommons:license>
	</item>
		<item>
		<title>First Look: An Entity Framework (LINQ to Entity) to IDataReader Adapter</title>
		<link>http://blogs.law.harvard.edu/brandonhaynes/2008/12/14/entity-framework-to-idatareader-adapter/</link>
		<comments>http://blogs.law.harvard.edu/brandonhaynes/2008/12/14/entity-framework-to-idatareader-adapter/#comments</comments>
		<pubDate>Sun, 14 Dec 2008 19:15:27 +0000</pubDate>
		<dc:creator>Brandon Haynes</dc:creator>
				<category><![CDATA[Entity Framework (EF)]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Entity Framework]]></category>
		<category><![CDATA[Linq]]></category>
		<category><![CDATA[Linq to Entities]]></category>

		<guid isPermaLink="false">http://blogs.law.harvard.edu/brandonhaynes/?p=35</guid>
		<description><![CDATA[Microsoft&#8217;s Entity Framework (EF) introduces a new data design paradigm within .NET. This framework, however, can be difficult to implement in projects that internally rely heavily on the exchange of IDataReader-implementing objects between layers (or within interface contracts). This is a shortcoming that is not easily overcome, especially without a standardized method with which to [...]]]></description>
			<content:encoded><![CDATA[<p>Microsoft&#8217;s <a href="http://msdn.microsoft.com/en-us/library/bb386992.aspx">Entity Framework</a> (EF) introduces a new data design paradigm within .NET. This framework, however, can be difficult to implement in projects that internally rely heavily on the exchange of <a href="http://msdn.microsoft.com/en-us/library/system.data.idatareader.aspx">IDataReader</a>-implementing objects between layers (or within interface contracts). This is a shortcoming that is not easily overcome, especially without a standardized method with which to convert EF entities into an object implementing this interface. In many ways, migration of these projects to the Entity Framework is an all-or-nothing proposition.  This is a shortcoming that begs for remediation. </p>
<p><span id="more-35"></span>Indeed, it would be advantageous to provide adaptation for entities within an EF/LINQ to Entity (L2E) model that was usable in such a legacy system. New code could directly utilize entity classes, while legacy interfaces could function as before. Such a system could be incrementally converted to a full EF implementation. This incremental approach has many practical advantages.<br />
<a href="http://blogs.law.harvard.edu/brandonhaynes/files/2008/12/idatareaderadaptermodel.png" rel="lightbox[35]"><img class="alignright size-full wp-image-36" style="float: right" src="http://blogs.law.harvard.edu/brandonhaynes/files/2008/12/idatareaderadaptermodel.png" alt="Layering of the IDataReader adapter model on top of the Entity Framework stack" width="276" height="716" /></a><br />
Herein (and over the next few related entries) is described an approach that resolves this shortcoming.  In its current form, it exists as a new layer at the top of the EF stack, as depicted in Figure 1 (right).  This layer is responsible for adapting EF entities to objects that implement the IDataReader¹ interface.</p>
<p>The resultant adapted IDataReaders may be used in any way, include across layers, so long as the underlying entities expose those properties expected by a consumer (including exposure through direct entity relationship).</p>
<p>Accordingly, the primary goals for this project include the following:</p>
<ul>
<li>Provide a per-entity adapter for each entity in a model, where each adapter implements the IDataReader and IDataRecord interfaces for use in legacy systems.</li>
<li>The resultant IDataReaders should be internally strongly-typed and performant (and thereby not use reflection²).</li>
<li>Model adaptation should be straightforward and easy to update as the model itself changes.</li>
<li>Adapters should expose all entity properties, including &#8220;flattened&#8221; properties established through entity relationships (as exposed through conceptual model NavigationProperties).</li>
</ul>
<p>These objectives are best accomplished through code generation.  This has the attractive characteristics of: compile-time validation, multiple-language targeting, model synchronization on a per-compile basis, performance gains, and strongly-typed code (an advantage given that an entity contains an arbitrary set of unknown properties).</p>
<p>Once adapted, we may construct a function that converts an entity (or set of entities) to an IDataReader-implementing construct, with code of the following general form: </p>
<div style="border: dashed 1px black;padding: 0.5em;margin-left: 1em"><code>public IDataReader GetEntities()<br />
{<br />
using (var context = new EntityContext())<br />
        return new DataReaders.EntityDataReader(context.Entities);<br />
}</code></div>
<p>Over the next few entries, we (i) describe use of the IDataReaderAdapter generation tool, (ii) investigate the generated IDataReader-implementing adapters in more detail, (iii) generate and discuss performance metrics, and (iv) implement a case-study utilization of adapter generation (demonstrating a database-agnostic <a href="http://www.dotnetnuke.com">DotNetNuke</a> hybrid data provider).</p>
<p>This project is available for public evaluation and consumption <a title="Entity Framework IDataReader Adapter" href="http://www.codeplex.com/L2EDataReaderAdapter">here</a>³.  It is distributed with a liberal source license for use in production environments. </p>
<p>For any that find this approach useful, or for those with additional questions, comments, or constructive criticism, I ask that you provide feedback here (or at the CodePlex site).  Your assessments and observations are an important part of any continued development.</p>
<p>B</p>
<hr />¹ Though this entry often refers to the IDataReader interface, the approach described herein may also be used to generate IDataRecord-compatible objects.  This latter contract may be substituted for the former in most every reference herein.</p>
<p> </p>
<p>² For types not known at compile-time, we include a reflection-enabled adapter.  Note that such an adapter may be used to adapt <em>any</em> object, including non-EF entity objects.  This additional flexibility is achieved at the expense of overall performance.</p>
<p>³ Project is expected to go live on or about December 15th, 2008.</p>



Share on:


	<a rel="nofollow" id="digg" href="javascript:window.location='http%3A%2F%2Fdigg.com%2Fsubmit%3Fphase%3D2%26amp%3Burl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F12%252F14%252Fentity-framework-to-idatareader-adapter%252F%26amp%3Btitle%3DFirst%2520Look%253A%2520An%2520Entity%2520Framework%2520%2528LINQ%2520to%2520Entity%2529%2520to%2520IDataReader%2520Adapter%26amp%3Bbodytext%3DMicrosoft%2527s%2520Entity%2520Framework%2520%2528EF%2529%2520introduces%2520a%2520new%2520data%2520design%2520paradigm%2520within%2520.NET.%2520This%2520framework%252C%2520however%252C%2520can%2520be%2520difficult%2520to%2520implement%2520in%2520projects%2520that%2520internally%2520rely%2520heavily%2520on%2520the%2520exchange%2520of%2520IDataReader-implementing%2520objects%2520between%2520layers%2520%2528o';" title="Digg"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow" id="del.icio.us" href="javascript:window.location='http%3A%2F%2Fdelicious.com%2Fpost%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F12%252F14%252Fentity-framework-to-idatareader-adapter%252F%26amp%3Btitle%3DFirst%2520Look%253A%2520An%2520Entity%2520Framework%2520%2528LINQ%2520to%2520Entity%2529%2520to%2520IDataReader%2520Adapter%26amp%3Bnotes%3DMicrosoft%2527s%2520Entity%2520Framework%2520%2528EF%2529%2520introduces%2520a%2520new%2520data%2520design%2520paradigm%2520within%2520.NET.%2520This%2520framework%252C%2520however%252C%2520can%2520be%2520difficult%2520to%2520implement%2520in%2520projects%2520that%2520internally%2520rely%2520heavily%2520on%2520the%2520exchange%2520of%2520IDataReader-implementing%2520objects%2520between%2520layers%2520%2528o';" title="del.icio.us"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow" id="facebook" href="javascript:window.location='http%3A%2F%2Fwww.facebook.com%2Fshare.php%3Fu%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F12%252F14%252Fentity-framework-to-idatareader-adapter%252F%26amp%3Bt%3DFirst%2520Look%253A%2520An%2520Entity%2520Framework%2520%2528LINQ%2520to%2520Entity%2529%2520to%2520IDataReader%2520Adapter';" title="Facebook"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow" id="google" href="javascript:window.location='http%3A%2F%2Fwww.google.com%2Fbookmarks%2Fmark%3Fop%3Dedit%26amp%3Bbkmk%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F12%252F14%252Fentity-framework-to-idatareader-adapter%252F%26amp%3Btitle%3DFirst%2520Look%253A%2520An%2520Entity%2520Framework%2520%2528LINQ%2520to%2520Entity%2529%2520to%2520IDataReader%2520Adapter%26amp%3Bannotation%3DMicrosoft%2527s%2520Entity%2520Framework%2520%2528EF%2529%2520introduces%2520a%2520new%2520data%2520design%2520paradigm%2520within%2520.NET.%2520This%2520framework%252C%2520however%252C%2520can%2520be%2520difficult%2520to%2520implement%2520in%2520projects%2520that%2520internally%2520rely%2520heavily%2520on%2520the%2520exchange%2520of%2520IDataReader-implementing%2520objects%2520between%2520layers%2520%2528o';" title="Google Bookmarks"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow" id="dotnetkicks" href="javascript:window.location='http%3A%2F%2Fwww.dotnetkicks.com%2Fkick%2F%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F12%252F14%252Fentity-framework-to-idatareader-adapter%252F%26amp%3Btitle%3DFirst%2520Look%253A%2520An%2520Entity%2520Framework%2520%2528LINQ%2520to%2520Entity%2529%2520to%2520IDataReader%2520Adapter';" title="DotNetKicks"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/dotnetkicks.png" title="DotNetKicks" alt="DotNetKicks" class="sociable-hovers" /></a>
	<img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/linkedin.png" title="LinkedIn" alt="LinkedIn" class="sociable-hovers" /></a>
	<a rel="nofollow" id="stumbleupon" href="javascript:window.location='http%3A%2F%2Fwww.stumbleupon.com%2Fsubmit%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F12%252F14%252Fentity-framework-to-idatareader-adapter%252F%26amp%3Btitle%3DFirst%2520Look%253A%2520An%2520Entity%2520Framework%2520%2528LINQ%2520to%2520Entity%2529%2520to%2520IDataReader%2520Adapter';" title="StumbleUpon"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/stumbleupon.png" title="StumbleUpon" alt="StumbleUpon" class="sociable-hovers" /></a>
	<a rel="nofollow" id="technorati" href="javascript:window.location='http%3A%2F%2Ftechnorati.com%2Ffaves%3Fadd%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F12%252F14%252Fentity-framework-to-idatareader-adapter%252F';" title="Technorati"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/technorati.png" title="Technorati" alt="Technorati" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://blogs.law.harvard.edu/brandonhaynes/2008/12/14/entity-framework-to-idatareader-adapter/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-sa/3.0/us/</creativeCommons:license>
	</item>
		<item>
		<title>A Second Look: Enabling ASP.NET 2.0 Localization in a DotNetNuke Application</title>
		<link>http://blogs.law.harvard.edu/brandonhaynes/2008/10/29/a-second-look-enabling-aspnet-20-localization-in-a-dotnetnuke-application-2/</link>
		<comments>http://blogs.law.harvard.edu/brandonhaynes/2008/10/29/a-second-look-enabling-aspnet-20-localization-in-a-dotnetnuke-application-2/#comments</comments>
		<pubDate>Wed, 29 Oct 2008 14:01:58 +0000</pubDate>
		<dc:creator>Brandon Haynes</dc:creator>
				<category><![CDATA[DotNetNuke (DNN) Content Management System]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[DotNetNuke]]></category>
		<category><![CDATA[Localization]]></category>

		<guid isPermaLink="false">http://blogs.law.harvard.edu/brandonhaynes/?p=33</guid>
		<description><![CDATA[Some time ago, I wrote about an approach for enabling&#160;ASP.NET 2.0 localization within a DotNetNuke application.  This approach not only required a core modification, but the change introduced a potential breaking change with third party modules.  This was clearly unsatisfactory, and the fact that I was unable to fully solve the problem has been vexing me for [...]]]></description>
			<content:encoded><![CDATA[<p>Some time ago, I <a href="http://blogs.law.harvard.edu/brandonhaynes/2008/04/08/enabling-aspnet-20-localization-in-a-dotnetnuke-application/">wrote</a> about an approach for enabling&nbsp;<a href="http://ASP.NET" title="http://ASP. " target="_blank">ASP.NET</a> 2.0 localization within a DotNetNuke application.  This approach not only required a core modification, but the change introduced a potential breaking change with third party modules.  This was clearly unsatisfactory, and the fact that I was unable to fully solve the problem has been vexing me for some time.</p>
<p>As my research on the recently-released <a href="http://blogs.law.harvard.edu/brandonhaynes/2008/10/14/adapting-the-linq-to-sql-attributed-meta-model-for-use-in-dotnetnuke/">Linq to Sql Adapter</a> (currently hosted on <a href="http://www.codeplex.com/DNNLinqToSqlAdapter">CodePlex</a>) wound down, I decided to investigate a new approach to solving the problem.  In my opinion, an optimal solution would fulfill the following requirements:</p>
<ol>
<li>Require no core changes</li>
<li>Be side-by-side compatible with the existing DotNetNuke localization services</li>
<li>Require little configuration by a hosting user</li>
<li>Allow strongly-typed per-portal and per-culture access to existing global DotNetNuke resources</li>
<li>Minimal additional in-memory footprint and reasonable performance</li>
<li>Enable use of the meta:resourcekey attribute in DotNetNuke modules</li>
<li>Be fully compatibility with third-party modules</li>
</ol>
<p>I am pleased to announce a preview release of a custom BuildProvider that, to my knowledge, accomplishes all of these goals.</p>
<p><span id="more-33"></span></p>
<p>For those not familiar with the issue at hand, I strongly recommend reading my <a href="http://blogs.law.harvard.edu/brandonhaynes/2008/04/08/enabling-aspnet-20-localization-in-a-dotnetnuke-application/">previous entry</a> for the relevant background information.  The remainder of this discourse will assume such familiarity.</p>
<p>The previous approach failed in satisfying two of the more important requirements above (specifically (1) and (7) above).  A core change was necessary to keep portal-specific localization files out of the App_GlobalResources directory where&nbsp;<a href="http://ASP.NET" title="http://ASP. " target="_blank">ASP.NET</a> would choke during automatic compilation.  This core change caused trouble with pre-compiled third-party modules because of the compile-time linking of publicly exposed constant values.  Clearly unsatisfactory, and clearly a dead-end.</p>
<p>This time around, I elected to utilize a different approach.  This revision includes a  custom BuildProvider which handles the full compilation life cycle for ResX files; in this manner such files may continue to exist in the App_GlobalResources directory and be fully side-by-side compatible with the DotNetNuke localization system.  Further, custom extensions allow portal-specific resource customizations to extend to the ResourceManager (including both strongly- and weakly-typed access).</p>
<p>For example, the strongly-typed variable (enabled via this BuildProvider) Resources.GlobalResources.Error_Text will consistently yield the same value obtained through a DotNetNuke.Services.Localization.Localization.GetString(&#8221;Error&#8221;, Localization.GlobalResourceFile). </p>
<p>Similarly, a meta:resourcekey attribute on an appropriately named control will yield the same value obtained through a call to UserModuleBase.GetLocalResourceObject(&#8230;).</p>
<h3>Configuration</h3>
<p>Configuration is straightforward, requiring only a single additional node in the web.config file (highlighted below):</p>
<pre>&lt;buildProviders&gt;</pre>
<pre>&lt;remove extension=".resx" /&gt;</pre>
<pre>  &lt;remove extension=".resources" /&gt;</pre>
<pre>  <strong><span style="color: #ff0000">&lt;add extension=".resx"    </span></strong></pre>
<pre><strong><span style="color: #ff0000">type="BrandonHaynes.DotNetNukeResXBuildProvider.ResXBuildProvider, </span></strong></pre>
<pre><strong><span style="color: #ff0000">BrandonHaynes.DotNetNukeResXBuildProvider" /&gt; </span></strong></pre>
<pre>&lt;/buildProviders&gt;</pre>
<p>Here, we keep the existing DotNetNuke &lt;remove&gt; elements and add the new BuildProvider to the list.  During startup,&nbsp;<a href="http://ASP.NET" title="http://ASP. " target="_blank">ASP.NET</a> will utilize this BuildProvider to compile all files with the .ResX extension.  This BuildProvider will handle strongly-typed class generation, ResourceManager decoration, and enable full&nbsp;<a href="http://ASP.NET" title="http://ASP. " target="_blank">ASP.NET</a> localization within the application.  That&#8217;s it!</p>
<h3>CodePlex Project</h3>
<p>As I gather feedback on the approach, I am initially releasing the BuildProvider project as a beta release.  Please understand that it is preview software, has undergone limited testing, and may break existing installations.  Though I am not currently aware of any outstanding issues, please use caution in a production environment.  Note that any custom BuildProvider, including this one, requires deployment in a Full Trust environment.</p>
<p>The project is available on CodePlex.  <a href="http://www.codeplex.com/DNNLocalization">Click here</a> to access.  Full source is available.</p>
<p>As I work to confirm that this BuildProvider works properly across a wider variety of installations, I would appreciate any and all feedback about the experiences of those using it.  It is greatly appreciated.</p>
<p>B</p>
<p><span style="font-size: smaller">* Installation of this module will still require the manual web.config modifications outlined above; at some point I will likely release a 5.0-compatible package that performs this task automatically.</span></p>



Share on:


	<a rel="nofollow" id="digg" href="javascript:window.location='http%3A%2F%2Fdigg.com%2Fsubmit%3Fphase%3D2%26amp%3Burl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F10%252F29%252Fa-second-look-enabling-aspnet-20-localization-in-a-dotnetnuke-application-2%252F%26amp%3Btitle%3DA%2520Second%2520Look%253A%2520Enabling%2520ASP.NET%25202.0%2520Localization%2520in%2520a%2520DotNetNuke%2520Application%26amp%3Bbodytext%3DSome%2520time%2520ago%252C%2520I%25C2%25A0wrote%25C2%25A0about%2520an%2520approach%2520for%2520enabling%2520ASP.NET%25202.0%2520localization%2520within%2520a%2520DotNetNuke%2520application.%25C2%25A0%2520This%2520approach%2520not%2520only%2520required%2520a%2520core%2520modification%252C%2520but%2520the%2520change%2520introduced%2520a%2520potential%2520breaking%2520change%2520with%2520third%2520party%2520modules.%25C2%25A0';" title="Digg"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow" id="del.icio.us" href="javascript:window.location='http%3A%2F%2Fdelicious.com%2Fpost%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F10%252F29%252Fa-second-look-enabling-aspnet-20-localization-in-a-dotnetnuke-application-2%252F%26amp%3Btitle%3DA%2520Second%2520Look%253A%2520Enabling%2520ASP.NET%25202.0%2520Localization%2520in%2520a%2520DotNetNuke%2520Application%26amp%3Bnotes%3DSome%2520time%2520ago%252C%2520I%25C2%25A0wrote%25C2%25A0about%2520an%2520approach%2520for%2520enabling%2520ASP.NET%25202.0%2520localization%2520within%2520a%2520DotNetNuke%2520application.%25C2%25A0%2520This%2520approach%2520not%2520only%2520required%2520a%2520core%2520modification%252C%2520but%2520the%2520change%2520introduced%2520a%2520potential%2520breaking%2520change%2520with%2520third%2520party%2520modules.%25C2%25A0';" title="del.icio.us"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow" id="facebook" href="javascript:window.location='http%3A%2F%2Fwww.facebook.com%2Fshare.php%3Fu%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F10%252F29%252Fa-second-look-enabling-aspnet-20-localization-in-a-dotnetnuke-application-2%252F%26amp%3Bt%3DA%2520Second%2520Look%253A%2520Enabling%2520ASP.NET%25202.0%2520Localization%2520in%2520a%2520DotNetNuke%2520Application';" title="Facebook"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow" id="google" href="javascript:window.location='http%3A%2F%2Fwww.google.com%2Fbookmarks%2Fmark%3Fop%3Dedit%26amp%3Bbkmk%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F10%252F29%252Fa-second-look-enabling-aspnet-20-localization-in-a-dotnetnuke-application-2%252F%26amp%3Btitle%3DA%2520Second%2520Look%253A%2520Enabling%2520ASP.NET%25202.0%2520Localization%2520in%2520a%2520DotNetNuke%2520Application%26amp%3Bannotation%3DSome%2520time%2520ago%252C%2520I%25C2%25A0wrote%25C2%25A0about%2520an%2520approach%2520for%2520enabling%2520ASP.NET%25202.0%2520localization%2520within%2520a%2520DotNetNuke%2520application.%25C2%25A0%2520This%2520approach%2520not%2520only%2520required%2520a%2520core%2520modification%252C%2520but%2520the%2520change%2520introduced%2520a%2520potential%2520breaking%2520change%2520with%2520third%2520party%2520modules.%25C2%25A0';" title="Google Bookmarks"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow" id="dotnetkicks" href="javascript:window.location='http%3A%2F%2Fwww.dotnetkicks.com%2Fkick%2F%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F10%252F29%252Fa-second-look-enabling-aspnet-20-localization-in-a-dotnetnuke-application-2%252F%26amp%3Btitle%3DA%2520Second%2520Look%253A%2520Enabling%2520ASP.NET%25202.0%2520Localization%2520in%2520a%2520DotNetNuke%2520Application';" title="DotNetKicks"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/dotnetkicks.png" title="DotNetKicks" alt="DotNetKicks" class="sociable-hovers" /></a>
	<img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/linkedin.png" title="LinkedIn" alt="LinkedIn" class="sociable-hovers" /></a>
	<a rel="nofollow" id="stumbleupon" href="javascript:window.location='http%3A%2F%2Fwww.stumbleupon.com%2Fsubmit%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F10%252F29%252Fa-second-look-enabling-aspnet-20-localization-in-a-dotnetnuke-application-2%252F%26amp%3Btitle%3DA%2520Second%2520Look%253A%2520Enabling%2520ASP.NET%25202.0%2520Localization%2520in%2520a%2520DotNetNuke%2520Application';" title="StumbleUpon"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/stumbleupon.png" title="StumbleUpon" alt="StumbleUpon" class="sociable-hovers" /></a>
	<a rel="nofollow" id="technorati" href="javascript:window.location='http%3A%2F%2Ftechnorati.com%2Ffaves%3Fadd%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F10%252F29%252Fa-second-look-enabling-aspnet-20-localization-in-a-dotnetnuke-application-2%252F';" title="Technorati"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/technorati.png" title="Technorati" alt="Technorati" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://blogs.law.harvard.edu/brandonhaynes/2008/10/29/a-second-look-enabling-aspnet-20-localization-in-a-dotnetnuke-application-2/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-sa/3.0/us/</creativeCommons:license>
	</item>
		<item>
		<title>Using the Linq to Sql Adapter in a DotNetNuke Module</title>
		<link>http://blogs.law.harvard.edu/brandonhaynes/2008/10/14/using-the-linq-to-sql-adapter-in-a-dotnetnuke-module/</link>
		<comments>http://blogs.law.harvard.edu/brandonhaynes/2008/10/14/using-the-linq-to-sql-adapter-in-a-dotnetnuke-module/#comments</comments>
		<pubDate>Tue, 14 Oct 2008 21:24:47 +0000</pubDate>
		<dc:creator>Brandon Haynes</dc:creator>
				<category><![CDATA[DotNetNuke (DNN) Content Management System]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[DotNetNuke]]></category>
		<category><![CDATA[Linq to Sql]]></category>

		<guid isPermaLink="false">http://blogs.law.harvard.edu/brandonhaynes/?p=29</guid>
		<description><![CDATA[In a previous entry, I discussed a potential solution to a longstanding problem.  The DotNetNuke CMS framework allows declaration of an object qualifier and database owner on a per-installation basis.  This effectively varies the fully-qualified database entity names at runtime.  Because the Linq to Sql system by default utilizes a class attribution approach, it does [...]]]></description>
			<content:encoded><![CDATA[<p>In a <a title="previous post" href="http://blogs.law.harvard.edu/brandonhaynes/2008/10/14/adapting-the-linq-to-sql-attributed-meta-model-for-use-in-dotnetnuke/">previous entry</a>, I discussed a potential solution to a longstanding problem.  The DotNetNuke CMS framework allows declaration of an object qualifier and database owner on a per-installation basis.  This effectively varies the fully-qualified database entity names at runtime.  Because the Linq to Sql system by default utilizes a class attribution approach, it does not lend itself well to such runtime adaptation.</p>
<p>Here I describe the steps necessary to use Linq to Sql within a DotNetNuke module in a reliable, distributable manner.</p>
<p><span id="more-29"></span></p>
<h4>1. Connect to your DotNetNuke database and add a set of Linq to Sql classes to your project</h4>
<p>There exist <a href="http://www.google.com/search?q=asp.net+linq+to+sql">thousands of tutorials</a> regarding this part of the process.  I suggest starting out with Scott Guthrie&#8217;s excellent <a href="http://weblogs.asp.net/scottgu/archive/2007/05/19/using-linq-to-sql-part-1.aspx">introduction</a>. </p>
<h4>2. Download the DotNetNuke Linq to Sql Model Adapter</h4>
<p>The model adapter is located on the CodePlex <a href="http://www.codeplex.com/DNNLinqToSqlAdapter">project site</a> and may be downloaded <a href="http://www.codeplex.com/DNNLinqToSqlAdapter/Release/ProjectReleases.aspx">here</a>.  The debug and release versions will contain a single assembly (BrandonHaynes.ModelAdapter.dll); copy this library to your project directory and include a reference to it in your project.</p>
<p>A sample module (source and install versions) and additional documentation are also available on the CodePlex site.</p>
<h4>3. Update your DataContext to derive from BrandonHaynes.ModelAdapter.DotNetNukeDataContext</h4>
<p>To use the adapter, you must change the base class of your DataContext to the specialized DotNetNuke adapter.  This is most easily accomplished by opening your Linq to Sql classes, right-clicking anywhere within the designer area, and selecting &#8220;Properties.&#8221;</p>
<p>Locate the Base Class line and change to &#8220;BrandonHaynes.ModelAdapter.DotNetNukeDataContext&#8221;.  Since the adapter will automatically override the connection string specified in your DataContext properties, I suggest leaving the original value therein.  Doing so will cause a parameterless constructor to be automatically generated, preventing you from being required to supplying a useless connection string during instantiation.</p>
<p style="text-align: center"><a href="http://blogs.law.harvard.edu/brandonhaynes/files/2008/10/datacontext.png" rel="lightbox[29]"><img style="vertical-align: middle" src="http://blogs.law.harvard.edu/brandonhaynes/files/2008/10/datacontext-300x164.png" alt="A DataContext with base class changed to use the DotNetNuke adapter." width="300" height="164" /></a></p>
<h4>4. Compile and Enjoy!</h4>
<p>That&#8217;s all there is to it.  At runtime, the adapter will automatically detect the existing metamodel constructed by your metasource (by default via attributes on your classes, properties, and members) and adjust them to reflect the DotNetNuke object qualifier and database owner.  No further intervention is required by the developer.</p>
<h4>Closing Comments</h4>
<p>This project is the result of an informal experiment; having heard that runtime meta-model manipulation was not possible, I wanted to verify and determine if this was indeed the case.  I expect that issues will arise, and would appreciate feedback about implementation experiences.  I am particularly interested in hearing from anyone who is actually successful using this library.  Specific issues should be logged in the CodePlex <a href="http://www.codeplex.com/DNNLinqToSqlAdapter/WorkItem/List.aspx">issue tracker</a>.</p>
<p>B</p>



Share on:


	<a rel="nofollow" id="digg" href="javascript:window.location='http%3A%2F%2Fdigg.com%2Fsubmit%3Fphase%3D2%26amp%3Burl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F10%252F14%252Fusing-the-linq-to-sql-adapter-in-a-dotnetnuke-module%252F%26amp%3Btitle%3DUsing%2520the%2520Linq%2520to%2520Sql%2520Adapter%2520in%2520a%2520DotNetNuke%2520Module%26amp%3Bbodytext%3DIn%2520a%2520previous%2520entry%252C%2520I%2520discussed%2520a%2520potential%2520solution%2520to%2520a%2520longstanding%2520problem.%25C2%25A0%2520The%2520DotNetNuke%2520CMS%2520framework%2520allows%2520declaration%2520of%2520an%2520object%2520qualifier%2520and%2520database%2520owner%2520on%2520a%2520per-installation%2520basis.%25C2%25A0%2520This%2520effectively%2520varies%2520the%2520fully-qualified%2520da';" title="Digg"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow" id="del.icio.us" href="javascript:window.location='http%3A%2F%2Fdelicious.com%2Fpost%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F10%252F14%252Fusing-the-linq-to-sql-adapter-in-a-dotnetnuke-module%252F%26amp%3Btitle%3DUsing%2520the%2520Linq%2520to%2520Sql%2520Adapter%2520in%2520a%2520DotNetNuke%2520Module%26amp%3Bnotes%3DIn%2520a%2520previous%2520entry%252C%2520I%2520discussed%2520a%2520potential%2520solution%2520to%2520a%2520longstanding%2520problem.%25C2%25A0%2520The%2520DotNetNuke%2520CMS%2520framework%2520allows%2520declaration%2520of%2520an%2520object%2520qualifier%2520and%2520database%2520owner%2520on%2520a%2520per-installation%2520basis.%25C2%25A0%2520This%2520effectively%2520varies%2520the%2520fully-qualified%2520da';" title="del.icio.us"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow" id="facebook" href="javascript:window.location='http%3A%2F%2Fwww.facebook.com%2Fshare.php%3Fu%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F10%252F14%252Fusing-the-linq-to-sql-adapter-in-a-dotnetnuke-module%252F%26amp%3Bt%3DUsing%2520the%2520Linq%2520to%2520Sql%2520Adapter%2520in%2520a%2520DotNetNuke%2520Module';" title="Facebook"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow" id="google" href="javascript:window.location='http%3A%2F%2Fwww.google.com%2Fbookmarks%2Fmark%3Fop%3Dedit%26amp%3Bbkmk%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F10%252F14%252Fusing-the-linq-to-sql-adapter-in-a-dotnetnuke-module%252F%26amp%3Btitle%3DUsing%2520the%2520Linq%2520to%2520Sql%2520Adapter%2520in%2520a%2520DotNetNuke%2520Module%26amp%3Bannotation%3DIn%2520a%2520previous%2520entry%252C%2520I%2520discussed%2520a%2520potential%2520solution%2520to%2520a%2520longstanding%2520problem.%25C2%25A0%2520The%2520DotNetNuke%2520CMS%2520framework%2520allows%2520declaration%2520of%2520an%2520object%2520qualifier%2520and%2520database%2520owner%2520on%2520a%2520per-installation%2520basis.%25C2%25A0%2520This%2520effectively%2520varies%2520the%2520fully-qualified%2520da';" title="Google Bookmarks"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow" id="dotnetkicks" href="javascript:window.location='http%3A%2F%2Fwww.dotnetkicks.com%2Fkick%2F%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F10%252F14%252Fusing-the-linq-to-sql-adapter-in-a-dotnetnuke-module%252F%26amp%3Btitle%3DUsing%2520the%2520Linq%2520to%2520Sql%2520Adapter%2520in%2520a%2520DotNetNuke%2520Module';" title="DotNetKicks"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/dotnetkicks.png" title="DotNetKicks" alt="DotNetKicks" class="sociable-hovers" /></a>
	<a rel="nofollow" id="linkedin" href="javascript:window.location='http%3A%2F%2Fwww.linkedin.com%2FshareArticle%3Fmini%3Dtrue%26amp%3Burl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F10%252F14%252Fusing-the-linq-to-sql-adapter-in-a-dotnetnuke-module%252F%26amp%3Btitle%3DUsing%2520the%2520Linq%2520to%2520Sql%2520Adapter%2520in%2520a%2520DotNetNuke%2520Module%26amp%3Bsource%3DFrom%2Bthe%2BDesk%2Bof%2BBrandon%2BHaynes%2BObservations%2Babout%2Bthe%2Bintersection%2Bof%2Btechnology%252C%2Bbusiness%252C%2Band%2Bintellectual%2Bproperty%26amp%3Bsummary%3DIn%2520a%2520previous%2520entry%252C%2520I%2520discussed%2520a%2520potential%2520solution%2520to%2520a%2520longstanding%2520problem.%25C2%25A0%2520The%2520DotNetNuke%2520CMS%2520framework%2520allows%2520declaration%2520of%2520an%2520object%2520qualifier%2520and%2520database%2520owner%2520on%2520a%2520per-installation%2520basis.%25C2%25A0%2520This%2520effectively%2520varies%2520the%2520fully-qualified%2520da';" title="LinkedIn"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/linkedin.png" title="LinkedIn" alt="LinkedIn" class="sociable-hovers" /></a>
	<a rel="nofollow" id="stumbleupon" href="javascript:window.location='http%3A%2F%2Fwww.stumbleupon.com%2Fsubmit%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F10%252F14%252Fusing-the-linq-to-sql-adapter-in-a-dotnetnuke-module%252F%26amp%3Btitle%3DUsing%2520the%2520Linq%2520to%2520Sql%2520Adapter%2520in%2520a%2520DotNetNuke%2520Module';" title="StumbleUpon"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/stumbleupon.png" title="StumbleUpon" alt="StumbleUpon" class="sociable-hovers" /></a>
	<a rel="nofollow" id="technorati" href="javascript:window.location='http%3A%2F%2Ftechnorati.com%2Ffaves%3Fadd%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F10%252F14%252Fusing-the-linq-to-sql-adapter-in-a-dotnetnuke-module%252F';" title="Technorati"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/technorati.png" title="Technorati" alt="Technorati" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://blogs.law.harvard.edu/brandonhaynes/2008/10/14/using-the-linq-to-sql-adapter-in-a-dotnetnuke-module/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-sa/3.0/us/</creativeCommons:license>
	</item>
		<item>
		<title>Adapting the Linq to Sql Attributed Meta-Model for Use in DotNetNuke</title>
		<link>http://blogs.law.harvard.edu/brandonhaynes/2008/10/14/adapting-the-linq-to-sql-attributed-meta-model-for-use-in-dotnetnuke/</link>
		<comments>http://blogs.law.harvard.edu/brandonhaynes/2008/10/14/adapting-the-linq-to-sql-attributed-meta-model-for-use-in-dotnetnuke/#comments</comments>
		<pubDate>Tue, 14 Oct 2008 17:15:46 +0000</pubDate>
		<dc:creator>Brandon Haynes</dc:creator>
				<category><![CDATA[DotNetNuke (DNN) Content Management System]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[DotNetNuke]]></category>
		<category><![CDATA[Linq]]></category>
		<category><![CDATA[Linq to Sql]]></category>

		<guid isPermaLink="false">http://blogs.law.harvard.edu/brandonhaynes/?p=28</guid>
		<description><![CDATA[The .NET-supplied DataContext allows Linq to Sql development using the attributed model automatically generated by a Visual Studio designer. However, when deployed within DotNetNuke, these attributes do not pick up the database owner and object qualfier required by DotNetNuke.  Because of this, large-scale deployment of modules using Linq to Sql is infesable, and modules using [...]]]></description>
			<content:encoded><![CDATA[<p>The .NET-supplied <a href="http://msdn.microsoft.com/en-us/library/system.data.linq.datacontext.aspx">DataContext</a> allows Linq to Sql development using the attributed model automatically generated by a Visual Studio designer. However, when deployed within DotNetNuke, these attributes do not pick up the database owner and object qualfier required by DotNetNuke.  Because of this, large-scale deployment of modules using Linq to Sql is infesable, and modules using the technology are unfortunately limited to internal applications.</p>
<p>To rememdy this issue, I have developed an adapter that converts the attributed meta model generated by the designer into a DotNetNuke-compatable model that uses both the object qualifier and database owner specified by an end-installation. </p>
<p><span id="more-28"></span></p>
<p>My goals for any satisfactory solution were as follows:</p>
<ul>
<li>Allow run-time adjustment of an attributed MetaModel based on DotNetNuke database owner and object qualifier (no irksome additional meta-schema)</li>
<li>Continued use of the Visual Studio Linq to Sql designer (no need to support a custom designer)</li>
<li>No tedious changes in the compiler-generated code</li>
<li>Continued use of an attributed-meta model (and thereby no external schema deployment files)</li>
</ul>
<p>It is unfortunate that the object model exposed by Microsoft is so frustratingly difficult to extend.  The Linq to Sql meta-objects are overwhelmingly read-only (and, frustratingly, the AttributedMetaModel subclasses are internal and sealed).  Indeed, it seemed that there was no simple remedy to the problem at hand.</p>
<p>My solution utilizes a two-step approach:</p>
<ul>
<li>An AttributedMetaModel is generated based on the attributes automatically created through the designer (Goal 2 and 4). This model is walked to generate an adapted schema (Goals 3).  Walking is reasonably inexpensive, and since the models are cached by type, performance is not affected.</li>
<li>This schema is transformed into an adapted model, which is cached and returned (Goal 1).  Models are thread-safe; caching is an easy performance improvement.</li>
</ul>
<p>I use dependency injection to adapt attributed entities (database, table, and function names) into their adapted counterparts. A DotNetNukeAdapter is included for this particular domain. Additional adapters could easily be constructed for other domains, should any arise (to illustrate this point, a NonTransformingAdapter is included in the release, which performs no transformations).</p>
<p><a href="http://www.codeplex.com/DNNLinqToSqlAdapter">Click here</a> to access the project site for additional <a href="http://www.codeplex.com/DNNLinqToSqlAdapter">details</a> and <a href="http://www.codeplex.com/DNNLinqToSqlAdapter/Release/ProjectReleases.aspx">downloads</a>.  Though the content herein is protected under the license below, be sure to consult the project license (New BSD) for integration-related details.</p>
<p>B</p>
<h4>Note</h4>
<p>This project is still in an embryotic, beta form.  I have performed limited testing, and have distributed an alpha version to a selected few (thanks especially to Michael Washington for taking a look).  Until satisfactory results have been achieved with a wider audience, I caution against production deployment.  Proceed with caution.</p>



Share on:


	<a rel="nofollow" id="digg" href="javascript:window.location='http%3A%2F%2Fdigg.com%2Fsubmit%3Fphase%3D2%26amp%3Burl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F10%252F14%252Fadapting-the-linq-to-sql-attributed-meta-model-for-use-in-dotnetnuke%252F%26amp%3Btitle%3DAdapting%2520the%2520Linq%2520to%2520Sql%2520Attributed%2520Meta-Model%2520for%2520Use%2520in%2520DotNetNuke%26amp%3Bbodytext%3DThe%2520.NET-supplied%2520DataContext%2520allows%2520Linq%2520to%2520Sql%2520development%2520using%2520the%2520attributed%2520model%2520automatically%2520generated%2520by%2520a%2520Visual%2520Studio%2520designer.%2520However%252C%2520when%2520deployed%2520within%2520DotNetNuke%252C%2520these%2520attributes%2520do%2520not%2520pick%2520up%2520the%2520database%2520owner%2520and%2520object%2520qualf';" title="Digg"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow" id="del.icio.us" href="javascript:window.location='http%3A%2F%2Fdelicious.com%2Fpost%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F10%252F14%252Fadapting-the-linq-to-sql-attributed-meta-model-for-use-in-dotnetnuke%252F%26amp%3Btitle%3DAdapting%2520the%2520Linq%2520to%2520Sql%2520Attributed%2520Meta-Model%2520for%2520Use%2520in%2520DotNetNuke%26amp%3Bnotes%3DThe%2520.NET-supplied%2520DataContext%2520allows%2520Linq%2520to%2520Sql%2520development%2520using%2520the%2520attributed%2520model%2520automatically%2520generated%2520by%2520a%2520Visual%2520Studio%2520designer.%2520However%252C%2520when%2520deployed%2520within%2520DotNetNuke%252C%2520these%2520attributes%2520do%2520not%2520pick%2520up%2520the%2520database%2520owner%2520and%2520object%2520qualf';" title="del.icio.us"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow" id="facebook" href="javascript:window.location='http%3A%2F%2Fwww.facebook.com%2Fshare.php%3Fu%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F10%252F14%252Fadapting-the-linq-to-sql-attributed-meta-model-for-use-in-dotnetnuke%252F%26amp%3Bt%3DAdapting%2520the%2520Linq%2520to%2520Sql%2520Attributed%2520Meta-Model%2520for%2520Use%2520in%2520DotNetNuke';" title="Facebook"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow" id="google" href="javascript:window.location='http%3A%2F%2Fwww.google.com%2Fbookmarks%2Fmark%3Fop%3Dedit%26amp%3Bbkmk%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F10%252F14%252Fadapting-the-linq-to-sql-attributed-meta-model-for-use-in-dotnetnuke%252F%26amp%3Btitle%3DAdapting%2520the%2520Linq%2520to%2520Sql%2520Attributed%2520Meta-Model%2520for%2520Use%2520in%2520DotNetNuke%26amp%3Bannotation%3DThe%2520.NET-supplied%2520DataContext%2520allows%2520Linq%2520to%2520Sql%2520development%2520using%2520the%2520attributed%2520model%2520automatically%2520generated%2520by%2520a%2520Visual%2520Studio%2520designer.%2520However%252C%2520when%2520deployed%2520within%2520DotNetNuke%252C%2520these%2520attributes%2520do%2520not%2520pick%2520up%2520the%2520database%2520owner%2520and%2520object%2520qualf';" title="Google Bookmarks"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow" id="dotnetkicks" href="javascript:window.location='http%3A%2F%2Fwww.dotnetkicks.com%2Fkick%2F%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F10%252F14%252Fadapting-the-linq-to-sql-attributed-meta-model-for-use-in-dotnetnuke%252F%26amp%3Btitle%3DAdapting%2520the%2520Linq%2520to%2520Sql%2520Attributed%2520Meta-Model%2520for%2520Use%2520in%2520DotNetNuke';" title="DotNetKicks"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/dotnetkicks.png" title="DotNetKicks" alt="DotNetKicks" class="sociable-hovers" /></a>
	<img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/linkedin.png" title="LinkedIn" alt="LinkedIn" class="sociable-hovers" /></a>
	<a rel="nofollow" id="stumbleupon" href="javascript:window.location='http%3A%2F%2Fwww.stumbleupon.com%2Fsubmit%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F10%252F14%252Fadapting-the-linq-to-sql-attributed-meta-model-for-use-in-dotnetnuke%252F%26amp%3Btitle%3DAdapting%2520the%2520Linq%2520to%2520Sql%2520Attributed%2520Meta-Model%2520for%2520Use%2520in%2520DotNetNuke';" title="StumbleUpon"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/stumbleupon.png" title="StumbleUpon" alt="StumbleUpon" class="sociable-hovers" /></a>
	<a rel="nofollow" id="technorati" href="javascript:window.location='http%3A%2F%2Ftechnorati.com%2Ffaves%3Fadd%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F10%252F14%252Fadapting-the-linq-to-sql-attributed-meta-model-for-use-in-dotnetnuke%252F';" title="Technorati"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/technorati.png" title="Technorati" alt="Technorati" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://blogs.law.harvard.edu/brandonhaynes/2008/10/14/adapting-the-linq-to-sql-attributed-meta-model-for-use-in-dotnetnuke/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-sa/3.0/us/</creativeCommons:license>
	</item>
		<item>
		<title>Improving DotNetNuke 5.0 Administrator Menu Organization</title>
		<link>http://blogs.law.harvard.edu/brandonhaynes/2008/10/12/improving-dotnetnuke-50-administrator-menu-organization/</link>
		<comments>http://blogs.law.harvard.edu/brandonhaynes/2008/10/12/improving-dotnetnuke-50-administrator-menu-organization/#comments</comments>
		<pubDate>Sun, 12 Oct 2008 10:38:45 +0000</pubDate>
		<dc:creator>Brandon Haynes</dc:creator>
				<category><![CDATA[DotNetNuke (DNN) Content Management System]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[DotNetNuke]]></category>

		<guid isPermaLink="false">http://blogs.law.harvard.edu/brandonhaynes/?p=23</guid>
		<description><![CDATA[One of my (few) cavils about the DotNetNuke Content Management System is the organization of the administrator menu.  Presenting an administrator with thirteen options (including somewhat inscrutable choices like &#8220;Extensions&#8221; and &#8220;Solutions&#8221;), is easily overwhelming for an often-technically unsophisticated administrator.  Indeed, both feedback from users and log analysis have indicated that several of these options are rarely [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: left"><a href="http://blogs.law.harvard.edu/brandonhaynes/files/2008/10/dnnadminmenubefore.png" rel="lightbox[23]"><img class="alignright size-medium wp-image-24" style="float: right" src="http://blogs.law.harvard.edu/brandonhaynes/files/2008/10/dnnadminmenubefore-300x289.png" alt="DotNetNuke Admin Menu (Original)" width="233" height="253" /></a>One of my (few) cavils about the <a href="http://dotnetnuke.com">DotNetNuke Content Management System</a> is the organization of the administrator menu.  Presenting an administrator with thirteen options (including somewhat inscrutable choices like &#8220;Extensions&#8221; and &#8220;Solutions&#8221;), is easily overwhelming for an often-technically unsophisticated administrator.  Indeed, both feedback from users and log analysis have indicated that several of these options are rarely utilized and thereby serve only to clutter the interface and increase the learning curve.</p>
<p>In pre-5.0 versions, despite being persisted to the database like any other page, the admin menu is restricted to one level.  This was a hardcoded limitation; though one could change the verbiage, order, or visibility of the items in the menu, one could not introduce additional levels of organization (without several changes to the core framework).</p>
<p>With DotNetNuke 5.0, however, because administrator pages are treated on-par with any other page on a site, an improvement in organization becomes possible.  Herein I discuss the changes necessary to, in my opinion, improve the overall organization of the DotNetNuke administrator menu.</p>
<p><span id="more-23"></span></p>
<p><a href="http://blogs.law.harvard.edu/brandonhaynes/files/2008/10/dnnadminmenuadvanced.png" rel="lightbox[23]"><img class="alignright size-thumbnail wp-image-25" style="float: right" src="http://blogs.law.harvard.edu/brandonhaynes/files/2008/10/dnnadminmenuadvanced-150x150.png" alt="DotNetNuke 5.0 Administrator Menu with Advanced Option" width="150" height="150" /></a>My goal was to group several of the less-used administrator menu options and place them under a new &#8220;Advanced&#8221; menu option.  The process for creating this tab was straightforward, with title &#8220;Advanced,&#8221; the &#8220;Disabled&#8221; checkbox selected, and &#8220;Admin&#8221; selected as the parent page.  It was also necessary to specify an icon.</p>
<p>Using the &#8220;Pages&#8221; tab, I next organized those pages that I felt were rarely used (or had only advanced application).  In my opinion, those pages were in the set { Site Settings, Log Viewer, Security Roles, Vendors, Extensions, and Solutions }.  Naturally, different sites have different requirements, and the list of pages falling into this category might vary.  The &#8220;Site Settings&#8221; option required particular consideration, but ultimately I felt that since it was only accessed initially that it was safe to tuck away and de-clutter the interface.</p>
<p>My page organization ultimately resulted in the following hierarchy*:</p>
<p style="text-align: center"><img class="aligncenter size-full wp-image-26" src="http://blogs.law.harvard.edu/brandonhaynes/files/2008/10/dotnetnukepages.png" alt="DotNetNuke Admin Page Organization" width="500" height="345" /></p>
<p style="font-size: smaller">* Astute readers will note that the &#8220;Site Wizard&#8221; option has been removed.  I generally prefer to remove this option after a customer has initialized his or her site.</p>
<p style="text-align: left">These changes resulted in an administrator menu that is, in my opinion, significantly more streamlined, intuitive, and user-friendly:</p>
<p style="text-align: center"><img class="size-medium wp-image-27" src="http://blogs.law.harvard.edu/brandonhaynes/files/2008/10/dnnadminmenuafter-300x265.png" alt="DotNetNuke Administrator Menu (After)" width="300" height="265" /></p>
<h2>Addendum</h2>
<p style="text-align: justify">I encountered one difficulty with this process of which readers should be aware.  When organizing the page hierarchy, I initially visited page settings and explicitly set the new page parent from the dropdown list.  However, this caused the icon to disappear.  Because the icons for administrator pages are located outside the portal directory (specifically, in &#8220;/images&#8221;), it became impossible to restore these icons.</p>
<p style="text-align: justify">This behavior does not appear to manifest when using the arrow links on the &#8220;Pages&#8221; tab (image above).  Therefore, until this behavior is corrected (or declared by design), I strongly suggest using this method as your exclusive means by which to organize the administrator hierarchy.</p>
<p>For those interested, the work item for this issue is located <a href="http://support.dotnetnuke.com/issue/ViewIssue.aspx?id=8599&amp;PROJID=23">here.</a></p>
<p>B</p>



Share on:


	<a rel="nofollow" id="digg" href="javascript:window.location='http%3A%2F%2Fdigg.com%2Fsubmit%3Fphase%3D2%26amp%3Burl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F10%252F12%252Fimproving-dotnetnuke-50-administrator-menu-organization%252F%26amp%3Btitle%3DImproving%2520DotNetNuke%25205.0%2520Administrator%2520Menu%2520Organization%26amp%3Bbodytext%3DOne%2520of%2520my%2520%2528few%2529%2520cavils%2520about%2520the%2520DotNetNuke%2520Content%2520Management%2520System%25C2%25A0is%2520the%2520organization%2520of%2520the%2520administrator%2520menu.%25C2%25A0%2520Presenting%2520an%2520administrator%2520with%2520thirteen%2520options%2520%2528including%25C2%25A0somewhat%2520inscrutable%2520choices%2520like%2520%2522Extensions%2522%2520and%2520%2522Solutions%2522%2529%252C%2520is%2520';" title="Digg"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow" id="del.icio.us" href="javascript:window.location='http%3A%2F%2Fdelicious.com%2Fpost%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F10%252F12%252Fimproving-dotnetnuke-50-administrator-menu-organization%252F%26amp%3Btitle%3DImproving%2520DotNetNuke%25205.0%2520Administrator%2520Menu%2520Organization%26amp%3Bnotes%3DOne%2520of%2520my%2520%2528few%2529%2520cavils%2520about%2520the%2520DotNetNuke%2520Content%2520Management%2520System%25C2%25A0is%2520the%2520organization%2520of%2520the%2520administrator%2520menu.%25C2%25A0%2520Presenting%2520an%2520administrator%2520with%2520thirteen%2520options%2520%2528including%25C2%25A0somewhat%2520inscrutable%2520choices%2520like%2520%2522Extensions%2522%2520and%2520%2522Solutions%2522%2529%252C%2520is%2520';" title="del.icio.us"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow" id="facebook" href="javascript:window.location='http%3A%2F%2Fwww.facebook.com%2Fshare.php%3Fu%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F10%252F12%252Fimproving-dotnetnuke-50-administrator-menu-organization%252F%26amp%3Bt%3DImproving%2520DotNetNuke%25205.0%2520Administrator%2520Menu%2520Organization';" title="Facebook"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow" id="google" href="javascript:window.location='http%3A%2F%2Fwww.google.com%2Fbookmarks%2Fmark%3Fop%3Dedit%26amp%3Bbkmk%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F10%252F12%252Fimproving-dotnetnuke-50-administrator-menu-organization%252F%26amp%3Btitle%3DImproving%2520DotNetNuke%25205.0%2520Administrator%2520Menu%2520Organization%26amp%3Bannotation%3DOne%2520of%2520my%2520%2528few%2529%2520cavils%2520about%2520the%2520DotNetNuke%2520Content%2520Management%2520System%25C2%25A0is%2520the%2520organization%2520of%2520the%2520administrator%2520menu.%25C2%25A0%2520Presenting%2520an%2520administrator%2520with%2520thirteen%2520options%2520%2528including%25C2%25A0somewhat%2520inscrutable%2520choices%2520like%2520%2522Extensions%2522%2520and%2520%2522Solutions%2522%2529%252C%2520is%2520';" title="Google Bookmarks"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow" id="dotnetkicks" href="javascript:window.location='http%3A%2F%2Fwww.dotnetkicks.com%2Fkick%2F%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F10%252F12%252Fimproving-dotnetnuke-50-administrator-menu-organization%252F%26amp%3Btitle%3DImproving%2520DotNetNuke%25205.0%2520Administrator%2520Menu%2520Organization';" title="DotNetKicks"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/dotnetkicks.png" title="DotNetKicks" alt="DotNetKicks" class="sociable-hovers" /></a>
	<img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/linkedin.png" title="LinkedIn" alt="LinkedIn" class="sociable-hovers" /></a>
	<a rel="nofollow" id="stumbleupon" href="javascript:window.location='http%3A%2F%2Fwww.stumbleupon.com%2Fsubmit%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F10%252F12%252Fimproving-dotnetnuke-50-administrator-menu-organization%252F%26amp%3Btitle%3DImproving%2520DotNetNuke%25205.0%2520Administrator%2520Menu%2520Organization';" title="StumbleUpon"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/stumbleupon.png" title="StumbleUpon" alt="StumbleUpon" class="sociable-hovers" /></a>
	<a rel="nofollow" id="technorati" href="javascript:window.location='http%3A%2F%2Ftechnorati.com%2Ffaves%3Fadd%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F10%252F12%252Fimproving-dotnetnuke-50-administrator-menu-organization%252F';" title="Technorati"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/technorati.png" title="Technorati" alt="Technorati" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://blogs.law.harvard.edu/brandonhaynes/2008/10/12/improving-dotnetnuke-50-administrator-menu-organization/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-sa/3.0/us/</creativeCommons:license>
	</item>
		<item>
		<title>Changing the Size of ReportViewer Parameter Dropdown List</title>
		<link>http://blogs.law.harvard.edu/brandonhaynes/2008/09/24/changing-the-size-of-reportviewer-parameter-dropdown-list/</link>
		<comments>http://blogs.law.harvard.edu/brandonhaynes/2008/09/24/changing-the-size-of-reportviewer-parameter-dropdown-list/#comments</comments>
		<pubDate>Wed, 24 Sep 2008 17:07:05 +0000</pubDate>
		<dc:creator>Brandon Haynes</dc:creator>
				<category><![CDATA[Microsoft Sql Server Reporting Services (SSRS)]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Microsoft Reporting Services]]></category>
		<category><![CDATA[Reporting Services]]></category>
		<category><![CDATA[ReportViewer]]></category>
		<category><![CDATA[SSRS]]></category>

		<guid isPermaLink="false">http://blogs.law.harvard.edu/brandonhaynes/?p=20</guid>
		<description><![CDATA[I recently encountered an issue with the SSRS ReportViewer control where the parameter drop-down list was of insufficient width for the parameters contained therein.  Surprisingly, a search yielded no solutions.  Indeed, several individuals indicated that changing this width was not possible.
Fortunately, it does turn out to be possible.

Firing up the IE developer toolbar, I immediately noted [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify"><a href="http://blogs.law.harvard.edu/brandonhaynes/files/2008/09/before.png" rel="lightbox[20]"><img class="alignright alignnone size-medium wp-image-21" style="float: right;margin-left: 12px;margin-right: 12px;border: black 1px solid" src="http://blogs.law.harvard.edu/brandonhaynes/files/2008/09/before-300x100.png" alt="SSRS Report Viewer Parameters Dropdown (Before)" width="300" height="100" /></a>I recently encountered an issue with the SSRS <a href="http://www.gotreportviewer.com/">ReportViewer</a> control where the parameter drop-down list was of insufficient width for the parameters contained therein.  Surprisingly, a <a href="http://www.google.com/search?q=reportviewer+changing+parameter+dropdown+width">search</a> yielded no solutions.  Indeed, several individuals indicated that changing this width was not possible.</p>
<p>Fortunately, it does turn out to be possible.</p>
<p><span id="more-20"></span></p>
<p style="text-align: justify">Firing up the <a href="http://en.wikipedia.org/wiki/IE_Developer_Toolbar">IE developer toolbar</a>, I immediately noted that (a) parameter controls were rendered outside the document hierarchy (in this case at the end of the FORM), (b) there was no class specified anywhere within the internal ReportViewer tag hierarchy, and (c) styles were hard-coded directly on the DIV tag which held the drop-down list (implemented as a TABLE).  Indeed, the width attribute on this DIV was hard-coded at 184px.  By default, the parameters dropdown appears as:</p>
<p style="text-align: center"><a href="http://blogs.law.harvard.edu/brandonhaynes/files/2008/09/before.png" rel="lightbox[20]"></a></p>
<p style="text-align: justify">Fortunately, while there was no specific class to hang a custom width from, it turns out that the id of this DIV was reliably predictable.  As such, a judiciously constructed style could indeed target (and thereby style) this tag.</p>
<p>The form of the id on the DIV in question is [Viewer ClientId]_ctl00_ctl03_divDropDown.  Here, ctl00 is the automatically-generated id of the Microsoft.Reporting.WebForms.ParametersArea control, and ctl03 is the id of the Microsoft.Reporting.WebForms.MultiValueValidValuesControl.</p>
<p>Putting this together, an initial style would read as:</p>
<p style="padding-left: 30px"><span style="font-size: x-small;color: #0000ff">&lt;</span><span style="font-size: x-small;color: #a31515">style</span><span style="font-size: x-small"> </span><span style="font-size: x-small;color: #ff0000">type</span><span style="font-size: x-small;color: #0000ff">=&#8221;text/css&#8221;&gt;<br />
</span><span style="font-size: x-small;color: #a31515">     DIV#&lt;%=</span><span style="font-size: x-small"> </span><span style="font-size: x-small;color: #a31515">Viewer.ClientID</span><span style="font-size: x-small"> %</span><span style="font-size: x-small;color: #a31515">&gt;</span><span style="font-size: x-small;color: #a31515">_ctl00_ctl03_divDropDown</span><span style="font-size: x-small"><span style="font-size: x-small"><br />
          {<br />
</span></span><span style="font-size: x-small"><span style="font-size: x-small"><span style="font-size: x-small;color: #ff0000">          width</span><span style="font-size: x-small">: </span><span style="font-size: x-small;color: #0000ff">320px</span><span style="font-size: x-small"> </span><span style="font-size: x-small;color: #0000ff">!important</span><span style="font-size: x-small">;<br />
          }<br />
</span></span></span><span style="font-size: x-small;color: #0000ff"><span style="font-size: x-small;color: #0000ff">&lt;/</span></span><span style="font-size: x-small;color: #0000ff"><span style="font-size: x-small;color: #0000ff"><span style="font-size: x-small;color: #a31515">style&gt;</span></span></span></p>
<p style="padding-left: 30px"><span style="font-size: x-small;color: #0000ff"><span style="font-size: x-small;color: #0000ff"><span style="color: #a31515">&lt;</span></span></span><span style="font-size: x-small;color: #a31515">rsweb</span><span style="font-size: x-small;color: #0000ff">:</span><span style="font-size: x-small;color: #a31515">ReportViewer</span><span style="font-size: x-small"> </span><span style="font-size: x-small;color: #ff0000">ID</span><span style="font-size: x-small;color: #0000ff">=&#8221;Viewer&#8221;</span><span style="font-size: x-small"> </span><span style="font-size: x-small;color: #ff0000">runat</span><span style="font-size: x-small;color: #0000ff">=&#8221;server&#8221;</span><span style="font-size: x-small"> </span><span style="font-size: x-small;color: #ff0000">Width</span><span style="font-size: x-small;color: #0000ff">=&#8221;100%&#8221;</span><span style="font-size: x-small"> </span><span style="font-size: x-small;color: #ff0000">Height</span><span style="font-size: x-small;color: #0000ff">=&#8221;600px&#8221;</span><span style="font-size: x-small"> </span><span style="font-size: x-small;color: #ff0000">ProcessingMode</span><span style="font-size: x-small;color: #0000ff">=&#8221;Remote&#8221;</span><span style="font-size: x-small"> </span><span style="font-size: x-small;color: #0000ff">/&gt;</span></p>
<p style="text-align: justify"><a href="http://blogs.law.harvard.edu/brandonhaynes/files/2008/09/after.png" rel="lightbox[20]"><img class="size-medium wp-image-22" style="float: right;margin-left: 12px;margin-right: 12px" src="http://blogs.law.harvard.edu/brandonhaynes/files/2008/09/after-300x100.png" alt="SSRS ReportViewer Parameter Dropdown (After)" width="300" height="100" /></a>Here we use the ClientID the ReportViewer (and its constituent ctl00 and ctl03 child and grandchild, respectively).  We also use an &#8220;!important&#8221; declaration to override the inline styling.  After our style is applied, the ReportViewer dropdown may be set to any size.</p>
<p style="text-align: justify">Note that it would be of better form to create a custom function that recurses the ReportViewer control hierarchy to locate the divDropDown control (and use its ClientID).  This would make the solution a bit more forward-looking and upgrade-friendly.  I leave this as an exercise to the reader (there are plenty of <a href="http://www.google.com/search?q=asp.net+recurse+the+control+tree">tutorials</a> out there about recursing the control tree).</p>
<p>Hope this helps anyone needing to resize this particular control.</p>
<p>B</p>



Share on:


	<a rel="nofollow" id="digg" href="javascript:window.location='http%3A%2F%2Fdigg.com%2Fsubmit%3Fphase%3D2%26amp%3Burl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F09%252F24%252Fchanging-the-size-of-reportviewer-parameter-dropdown-list%252F%26amp%3Btitle%3DChanging%2520the%2520Size%2520of%2520ReportViewer%2520Parameter%2520Dropdown%2520List%26amp%3Bbodytext%3DI%2520recently%2520encountered%2520an%2520issue%2520with%2520the%2520SSRS%2520ReportViewer%2520control%2520where%2520the%2520parameter%2520drop-down%2520list%2520was%2520of%2520insufficient%2520width%2520for%2520the%2520parameters%2520contained%2520therein.%25C2%25A0%2520Surprisingly%252C%2520a%2520search%25C2%25A0yielded%2520no%2520solutions.%25C2%25A0%2520Indeed%252C%2520several%2520individuals%2520indica';" title="Digg"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow" id="del.icio.us" href="javascript:window.location='http%3A%2F%2Fdelicious.com%2Fpost%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F09%252F24%252Fchanging-the-size-of-reportviewer-parameter-dropdown-list%252F%26amp%3Btitle%3DChanging%2520the%2520Size%2520of%2520ReportViewer%2520Parameter%2520Dropdown%2520List%26amp%3Bnotes%3DI%2520recently%2520encountered%2520an%2520issue%2520with%2520the%2520SSRS%2520ReportViewer%2520control%2520where%2520the%2520parameter%2520drop-down%2520list%2520was%2520of%2520insufficient%2520width%2520for%2520the%2520parameters%2520contained%2520therein.%25C2%25A0%2520Surprisingly%252C%2520a%2520search%25C2%25A0yielded%2520no%2520solutions.%25C2%25A0%2520Indeed%252C%2520several%2520individuals%2520indica';" title="del.icio.us"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow" id="facebook" href="javascript:window.location='http%3A%2F%2Fwww.facebook.com%2Fshare.php%3Fu%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F09%252F24%252Fchanging-the-size-of-reportviewer-parameter-dropdown-list%252F%26amp%3Bt%3DChanging%2520the%2520Size%2520of%2520ReportViewer%2520Parameter%2520Dropdown%2520List';" title="Facebook"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow" id="google" href="javascript:window.location='http%3A%2F%2Fwww.google.com%2Fbookmarks%2Fmark%3Fop%3Dedit%26amp%3Bbkmk%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F09%252F24%252Fchanging-the-size-of-reportviewer-parameter-dropdown-list%252F%26amp%3Btitle%3DChanging%2520the%2520Size%2520of%2520ReportViewer%2520Parameter%2520Dropdown%2520List%26amp%3Bannotation%3DI%2520recently%2520encountered%2520an%2520issue%2520with%2520the%2520SSRS%2520ReportViewer%2520control%2520where%2520the%2520parameter%2520drop-down%2520list%2520was%2520of%2520insufficient%2520width%2520for%2520the%2520parameters%2520contained%2520therein.%25C2%25A0%2520Surprisingly%252C%2520a%2520search%25C2%25A0yielded%2520no%2520solutions.%25C2%25A0%2520Indeed%252C%2520several%2520individuals%2520indica';" title="Google Bookmarks"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow" id="dotnetkicks" href="javascript:window.location='http%3A%2F%2Fwww.dotnetkicks.com%2Fkick%2F%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F09%252F24%252Fchanging-the-size-of-reportviewer-parameter-dropdown-list%252F%26amp%3Btitle%3DChanging%2520the%2520Size%2520of%2520ReportViewer%2520Parameter%2520Dropdown%2520List';" title="DotNetKicks"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/dotnetkicks.png" title="DotNetKicks" alt="DotNetKicks" class="sociable-hovers" /></a>
	<a rel="nofollow" id="linkedin" href="javascript:window.location='http%3A%2F%2Fwww.linkedin.com%2FshareArticle%3Fmini%3Dtrue%26amp%3Burl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F09%252F24%252Fchanging-the-size-of-reportviewer-parameter-dropdown-list%252F%26amp%3Btitle%3DChanging%2520the%2520Size%2520of%2520ReportViewer%2520Parameter%2520Dropdown%2520List%26amp%3Bsource%3DFrom%2Bthe%2BDesk%2Bof%2BBrandon%2BHaynes%2BObservations%2Babout%2Bthe%2Bintersection%2Bof%2Btechnology%252C%2Bbusiness%252C%2Band%2Bintellectual%2Bproperty%26amp%3Bsummary%3DI%2520recently%2520encountered%2520an%2520issue%2520with%2520the%2520SSRS%2520ReportViewer%2520control%2520where%2520the%2520parameter%2520drop-down%2520list%2520was%2520of%2520insufficient%2520width%2520for%2520the%2520parameters%2520contained%2520therein.%25C2%25A0%2520Surprisingly%252C%2520a%2520search%25C2%25A0yielded%2520no%2520solutions.%25C2%25A0%2520Indeed%252C%2520several%2520individuals%2520indica';" title="LinkedIn"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/linkedin.png" title="LinkedIn" alt="LinkedIn" class="sociable-hovers" /></a>
	<a rel="nofollow" id="stumbleupon" href="javascript:window.location='http%3A%2F%2Fwww.stumbleupon.com%2Fsubmit%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F09%252F24%252Fchanging-the-size-of-reportviewer-parameter-dropdown-list%252F%26amp%3Btitle%3DChanging%2520the%2520Size%2520of%2520ReportViewer%2520Parameter%2520Dropdown%2520List';" title="StumbleUpon"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/stumbleupon.png" title="StumbleUpon" alt="StumbleUpon" class="sociable-hovers" /></a>
	<a rel="nofollow" id="technorati" href="javascript:window.location='http%3A%2F%2Ftechnorati.com%2Ffaves%3Fadd%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F09%252F24%252Fchanging-the-size-of-reportviewer-parameter-dropdown-list%252F';" title="Technorati"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/technorati.png" title="Technorati" alt="Technorati" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://blogs.law.harvard.edu/brandonhaynes/2008/09/24/changing-the-size-of-reportviewer-parameter-dropdown-list/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-sa/3.0/us/</creativeCommons:license>
	</item>
		<item>
		<title>DotNetNuke Debugging with Debug-Build Assemblies (4.9 Update)</title>
		<link>http://blogs.law.harvard.edu/brandonhaynes/2008/09/14/dotnetnuke-debugging-with-debug-build-assemblies-49-update/</link>
		<comments>http://blogs.law.harvard.edu/brandonhaynes/2008/09/14/dotnetnuke-debugging-with-debug-build-assemblies-49-update/#comments</comments>
		<pubDate>Sun, 14 Sep 2008 15:22:00 +0000</pubDate>
		<dc:creator>Brandon Haynes</dc:creator>
				<category><![CDATA[DotNetNuke (DNN) Content Management System]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Debugging]]></category>
		<category><![CDATA[DotNetNuke]]></category>

		<guid isPermaLink="false">http://everysport.net/GamePlan3/Default.aspx?tabid=489&amp;EntryID=12</guid>
		<description><![CDATA[I recently wrote about the use of debug-build assemblies to identify and correct difficult&#8211;to-diagnose problems with a DotNetNuke installation (see this for a detailed discussion).
To date, a number of people have successfully used these builds in correcting a number of relatively arcane problems.  As such, I have elected to deploy debug-build version of the core DNN assemblies [...]]]></description>
			<content:encoded><![CDATA[<p>I <a href="http://blogs.law.harvard.edu/brandonhaynes/2008/07/21/enhanced-dotnetnuke-debugging-with-debug-build-assemblies-updated-for-49/"><span style="text-decoration: underline"><span style="color: #669966">recently</span></span></a> wrote about the use of debug-build assemblies to identify and correct difficult&#8211;to-diagnose problems with a DotNetNuke installation (see <a href="http://blogs.law.harvard.edu/brandonhaynes/2008/07/21/debugging-difficult-exceptions-in-dotnetnuke/"><span style="text-decoration: underline"><span style="color: #669966">this</span></span></a> for a detailed discussion).</p>
<p>To date, a number of people have successfully used these builds in correcting a number of relatively arcane problems.  As such, I have elected to deploy debug-build version of the core DNN assemblies for the recently-released 4.9 version.</p>
<p><span id="more-6"></span>As before:</p>
<blockquote><p>THIS SOFTWARE IS PROVIDED &#8220;AS IS&#8221;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</p></blockquote>
<p>Also, DotNetNuke Corporation requires that I receive consent to the following licence as a precondition to use of its software.  Downloading any of the assemblies provided below indicates binding consent to these term:</p>
<blockquote><p>DotNetNuke is provided free, as open-source software, and licensed under a BSD-style agreement.  The licensing agreement reads as follows: </p>
<p>DotNetNuke® &#8211; <a href="http://www.dotnetnuke.com/"><span style="text-decoration: underline"><span style="color: #669966">http://www.dotnetnuke.com</span></span></a><br />
Copyright (C) 2002-2008<br />
by DotNetNuke Corporation</p>
<p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the &#8220;Software&#8221;), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:</p>
<p>The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.</p>
<p>THE SOFTWARE IS PROVIDED &#8220;AS IS&#8221;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</p></blockquote>
<p>For instructions in the use of the following assemblies, please see <a href="http://blogs.law.harvard.edu/brandonhaynes/2008/07/21/enhanced-dotnetnuke-debugging-with-debug-build-assemblies-updated-for-49/"><span style="text-decoration: underline"><span style="color: #669966">this entry</span></span></a>.</p>
<p>Debug-build assemblies:</p>
<ul>
<li><a href="http://brandonhaynes.org/Downloads/DotNetNuke.4.9.zip"><span style="text-decoration: underline"><span style="color: #669966">DotNetNuke.dll</span></span></a> (4.9)</li>
<li><a href="http://brandonhaynes.org/Downloads/DotNetNuke.HttpModules.4.9.zip"><span style="text-decoration: underline"><span style="color: #669966">DotNetNuke.HttpModules.dll</span></span></a> (4.9)</li>
</ul>
<p>B</p>



Share on:


	<a rel="nofollow" id="digg" href="javascript:window.location='http%3A%2F%2Fdigg.com%2Fsubmit%3Fphase%3D2%26amp%3Burl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F09%252F14%252Fdotnetnuke-debugging-with-debug-build-assemblies-49-update%252F%26amp%3Btitle%3DDotNetNuke%2520Debugging%2520with%2520Debug-Build%2520Assemblies%2520%25284.9%2520Update%2529%26amp%3Bbodytext%3DI%2520recently%25C2%25A0wrote%2520about%2520the%2520use%2520of%2520debug-build%2520assemblies%2520to%2520identify%2520and%2520correct%2520difficult--to-diagnose%2520problems%2520with%2520a%2520DotNetNuke%2520installation%2520%2528see%2520this%25C2%25A0for%2520a%2520detailed%2520discussion%2529.%250D%250A%250D%250ATo%2520date%252C%2520a%2520number%2520of%2520people%2520have%2520successfully%2520used%2520these%2520builds';" title="Digg"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow" id="del.icio.us" href="javascript:window.location='http%3A%2F%2Fdelicious.com%2Fpost%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F09%252F14%252Fdotnetnuke-debugging-with-debug-build-assemblies-49-update%252F%26amp%3Btitle%3DDotNetNuke%2520Debugging%2520with%2520Debug-Build%2520Assemblies%2520%25284.9%2520Update%2529%26amp%3Bnotes%3DI%2520recently%25C2%25A0wrote%2520about%2520the%2520use%2520of%2520debug-build%2520assemblies%2520to%2520identify%2520and%2520correct%2520difficult--to-diagnose%2520problems%2520with%2520a%2520DotNetNuke%2520installation%2520%2528see%2520this%25C2%25A0for%2520a%2520detailed%2520discussion%2529.%250D%250A%250D%250ATo%2520date%252C%2520a%2520number%2520of%2520people%2520have%2520successfully%2520used%2520these%2520builds';" title="del.icio.us"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow" id="facebook" href="javascript:window.location='http%3A%2F%2Fwww.facebook.com%2Fshare.php%3Fu%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F09%252F14%252Fdotnetnuke-debugging-with-debug-build-assemblies-49-update%252F%26amp%3Bt%3DDotNetNuke%2520Debugging%2520with%2520Debug-Build%2520Assemblies%2520%25284.9%2520Update%2529';" title="Facebook"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow" id="google" href="javascript:window.location='http%3A%2F%2Fwww.google.com%2Fbookmarks%2Fmark%3Fop%3Dedit%26amp%3Bbkmk%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F09%252F14%252Fdotnetnuke-debugging-with-debug-build-assemblies-49-update%252F%26amp%3Btitle%3DDotNetNuke%2520Debugging%2520with%2520Debug-Build%2520Assemblies%2520%25284.9%2520Update%2529%26amp%3Bannotation%3DI%2520recently%25C2%25A0wrote%2520about%2520the%2520use%2520of%2520debug-build%2520assemblies%2520to%2520identify%2520and%2520correct%2520difficult--to-diagnose%2520problems%2520with%2520a%2520DotNetNuke%2520installation%2520%2528see%2520this%25C2%25A0for%2520a%2520detailed%2520discussion%2529.%250D%250A%250D%250ATo%2520date%252C%2520a%2520number%2520of%2520people%2520have%2520successfully%2520used%2520these%2520builds';" title="Google Bookmarks"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow" id="dotnetkicks" href="javascript:window.location='http%3A%2F%2Fwww.dotnetkicks.com%2Fkick%2F%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F09%252F14%252Fdotnetnuke-debugging-with-debug-build-assemblies-49-update%252F%26amp%3Btitle%3DDotNetNuke%2520Debugging%2520with%2520Debug-Build%2520Assemblies%2520%25284.9%2520Update%2529';" title="DotNetKicks"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/dotnetkicks.png" title="DotNetKicks" alt="DotNetKicks" class="sociable-hovers" /></a>
	<img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/linkedin.png" title="LinkedIn" alt="LinkedIn" class="sociable-hovers" /></a>
	<a rel="nofollow" id="stumbleupon" href="javascript:window.location='http%3A%2F%2Fwww.stumbleupon.com%2Fsubmit%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F09%252F14%252Fdotnetnuke-debugging-with-debug-build-assemblies-49-update%252F%26amp%3Btitle%3DDotNetNuke%2520Debugging%2520with%2520Debug-Build%2520Assemblies%2520%25284.9%2520Update%2529';" title="StumbleUpon"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/stumbleupon.png" title="StumbleUpon" alt="StumbleUpon" class="sociable-hovers" /></a>
	<a rel="nofollow" id="technorati" href="javascript:window.location='http%3A%2F%2Ftechnorati.com%2Ffaves%3Fadd%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F09%252F14%252Fdotnetnuke-debugging-with-debug-build-assemblies-49-update%252F';" title="Technorati"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/technorati.png" title="Technorati" alt="Technorati" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://blogs.law.harvard.edu/brandonhaynes/2008/09/14/dotnetnuke-debugging-with-debug-build-assemblies-49-update/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-sa/3.0/us/</creativeCommons:license>
	</item>
		<item>
		<title>Configuring custom INavigationService in WCSF Contrib library (Updated)</title>
		<link>http://blogs.law.harvard.edu/brandonhaynes/2008/07/22/configuring-custom-inavigationservice-in-wcsf-contrib-library-updated/</link>
		<comments>http://blogs.law.harvard.edu/brandonhaynes/2008/07/22/configuring-custom-inavigationservice-in-wcsf-contrib-library-updated/#comments</comments>
		<pubDate>Tue, 22 Jul 2008 14:14:00 +0000</pubDate>
		<dc:creator>Brandon Haynes</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[Web Client Software Factory (WCSF)]]></category>
		<category><![CDATA[INavigationService]]></category>
		<category><![CDATA[WCSF]]></category>

		<guid isPermaLink="false">http://everysport.net/GamePlan3/Default.aspx?tabid=489&amp;EntryID=11</guid>
		<description><![CDATA[I recently wrote about implementing a custom PageFlow navigation provider in the WCSF library.  Since then, the patterns team has broken out the PageFlow block into a separate package (formally the &#8220;Patterns &#38; Practices: Web Client Software Factory Contrib&#8220;).
Since my existing PageFlow navigation provider-related modifications became obsolete with this change, I thought I&#8217;d spend a [...]]]></description>
			<content:encoded><![CDATA[<p>I <a href="http://blogs.law.harvard.edu/brandonhaynes/2008/02/17/configuring-custom-inavigationservice-in-wcsf-library/"><span style="color: #669966">recently wrote</span></a> about implementing a custom PageFlow navigation provider in the WCSF library.  Since then, the patterns team has broken out the PageFlow block into a separate package (formally the &#8220;<a href="http://www.codeplex.com/wcsfcontrib"><span style="color: #669966">Patterns &amp; Practices: Web Client Software Factory Contrib</span></a>&#8220;).</p>
<p>Since my existing PageFlow navigation provider-related modifications became obsolete with this change, I thought I&#8217;d spend a few minutes porting my changes to the new block.  I actually completed this task a couple of months ago, but have just now found the time to post it publicly.  Thanks to those who persevered in prodding me to put it online!</p>
<p><span id="more-7"></span></p>
<h3>WCSF Changes</h3>
<p>The web.config setting is identical to the original setting, marked up as:</p>
<pre><span class="kwrd">&lt;</span><span class="html">pageFlowProvider</span> <span class="attr">providerType</span><span class="kwrd">="WCSFContrib.PageFlow.Xml.XmlPageFlowProvider, WCSFContrib.PageFlow.Xml"</span> <span class="attr">navigationType</span><span class="kwrd">="<strong>[Fully Qualified Assembly Name]</strong>"</span> <span class="kwrd">/&gt;</span></pre>
<pre>This change is picked up through an addition to Configuration/PageFlowProviderSection.cs, as:</pre>
<pre>        <span class="rem">/// &lt;summary&gt;</span>
        <span class="rem">/// Defines the concrete type of the INavigator.</span>
        <span class="rem">/// &lt;/summary&gt;</span>
        [ConfigurationProperty(<span class="str">"navigationType"</span>, DefaultValue = <span class="str">"WCSFContrib.PageFlow.Services.NavigationService"</span>, IsRequired = <span class="kwrd">false</span>)]
        <span class="kwrd">public</span> <span class="kwrd">string</span> NavigationType
            {
            get { <span class="kwrd">return</span> (<span class="kwrd">string</span>)<span class="kwrd">base</span>[<span class="str">"navigationType"</span>]; }
            }</pre>
<p> </p>
<p>Next, the BuildProvider method of PageFlowDirectory (PageFlowDirectory.cs) must be augmented to pick up the specified provider and load it (changes in bold):</p>
<pre>        <span class="kwrd">private</span> <span class="kwrd">static</span> IPageFlowProvider BuildProvider()
        {
            PageFlowProviderSection configSection =
                (PageFlowProviderSection) ConfigurationManager.GetSection(<span class="str">"pageFlow/pageFlowProvider"</span>);
            PageFlowInstanceStoreProviderSection storeSection =
                (PageFlowInstanceStoreProviderSection) ConfigurationManager.GetSection(<span class="str">"pageFlow/pageFlowInstanceStoreProvider"</span>);
            PageFlowInstanceCorrelationTokenProviderSection tokenProviderSection =
                (PageFlowInstanceCorrelationTokenProviderSection)ConfigurationManager.GetSection(<span class="str">"pageFlow/pageFlowInstanceCorrelationTokenProvider"</span>);
            Type providerType = Type.GetType(configSection.ProviderType);
<strong>            Type navigationType = Type.GetType(configSection.NavigationType);
</strong>
<strong>            <span class="kwrd">if</span> (navigationType == <span class="kwrd">null</span>)
                <span class="kwrd">throw</span> <span class="kwrd">new</span> InvalidOperationException(<span class="str">"Invalid navigationType specified: "</span> + configSection.NavigationType);

            Services.INavigationService navigationService = (Services.INavigationService)Activator.CreateInstance(navigationType);
</strong>            _provider = (IPageFlowProvider)Activator.CreateInstance(providerType,
                                                                    BindingFlags.CreateInstance,
                                                                    <span class="kwrd">null</span>,
<strong>                                                                    <span class="kwrd">new</span> <span class="kwrd">object</span>[] { navigationService, storeSection, tokenProviderSection },
</strong>                                                                    CultureInfo.CurrentCulture);
            <span class="kwrd">return</span> _provider;
        }</pre>
<p>Finally, each concrete provider must be modified to accept the appropriate navigationService as a constructor parameter. In the case of the XmlPageFlowProvider, this would result in the following changes (highlighted in bold):</p>
<pre>        <span class="kwrd">public</span> XmlPageFlowProvider(INavigationService navigationService, ...)
        {
            <span class="kwrd">if</span> (pageFlowInstanceStoreProviderSection == <span class="kwrd">null</span>)
                <span class="kwrd">throw</span> <span class="kwrd">new</span> ArgumentNullException(<span class="str">"pageFlowInstanceStoreProviderSection"</span>);

            <span class="kwrd">if</span> (pageFlowCorrelationTokenProviderSection == <span class="kwrd">null</span>)
                <span class="kwrd">throw</span> <span class="kwrd">new</span> ArgumentNullException(<span class="str">"pageFlowCorrelationTokenProviderSection"</span>);

            IDictionary&lt;<span class="kwrd">string</span>, NavigationGraph&gt; navigationGraphs = <span class="kwrd">new</span> WebConfigStore().GetXmlPageFlowNavigationGraphs();

<strong>            _pageFlowFactory = <span class="kwrd">new</span> XmlPageFlowFactory(navigationGraphs, navigationService);
  </strong>          <span class="rem">//_pageFlowFactory = new XmlPageFlowFactory(navigationGraphs, new NavigationService());</span>

            Type tokenProviderType = Type.GetType(pageFlowCorrelationTokenProviderSection.ProviderType, <span class="kwrd">true</span>, <span class="kwrd">true</span>);
            IPageFlowCorrelationTokenProvider _tokenProvider =
                (IPageFlowCorrelationTokenProvider)Activator.CreateInstance(tokenProviderType);

            Type storeType = Type.GetType(pageFlowInstanceStoreProviderSection.ProviderType, <span class="kwrd">true</span>, <span class="kwrd">true</span>);
            _store =
                (IPageFlowInstanceStore)Activator.CreateInstance(storeType, BindingFlags.CreateInstance, <span class="kwrd">null</span>,
                                                                  <span class="kwrd">new</span> <span class="kwrd">object</span>[]
                                                                      {
                                                                          pageFlowInstanceStoreProviderSection.ConnectionStringName,
                                                                        _tokenProvider
                                                                      },
                                                                  CultureInfo.CurrentCulture);
            PopulateDirectory(navigationGraphs);
         }</pre>
<p>As a footnote, I did consider modifying the NavigationService directly to instantiate and decorate an underlying custom NavigationProvider. While this might have resulted in one less code change, I do not feel that it is of optimal design. Concrete PageFlow providers should not be responsible for instantiation of their navigationProviders; these objects should be injected, for maximum flexibility. </p>
<h3>Downloads</h3>
<ul>
<li><a href="http://brandonhaynes.org/Downloads/WCSFContrib.PageFlow.zip">WCSFContrib.PageFlow.DLL and WCSFContrib.PageFlow.Xml.DLL </a></li>
<li><a href="http://brandonhaynes.org/Downloads/PageFlowSourceModifications.zip">WCSFContrib.PageFlow and WCSFContrib.PageFlow.Xml Source</a> (Modified files only!)</li>
</ul>
<p>For the complete (pre-modification) package, visit the project homepage at <a title="http://www.codeplex.com/wcsfcontrib" href="http://www.codeplex.com/wcsfcontrib"><span style="color: #669966">http://www.codeplex.com/wcsfcontrib</span></a>.  For those keeping score, I&#8217;ve created a work item for this change here.</p>
<h3>Coming Soon: Using the PageFlow Application Block within DotNetNuke</h3>
<p>The WCSF PageFlow package continues to be an excellent application block.  It is a shame that it continues to be so ASPX-centric.  The modifications herein are a first step toward removing this limitation and allowing it to be used in more flexible circumstances, such as an ASCX-based state machine or within the DNN framework.</p>
<p>For anyone who is interested, I am now using this application block successfully (soon to be in production) within the DotNetNuke framework, using:</p>
<ul>
<li>The block-level modifications outlined above</li>
<li>A custom navigation service (currently SelfRedirectingNavigationService, though, as I will blog about sometime soon, I have some enhancements in store in this area)</li>
<li>A web.config-defined XmlPageFlow provider state machine</li>
<li>A module shell with some custom wire-up code</li>
<li>One ASCX control for each state in the XmlPageFlow state machine</li>
</ul>
<p>I will continue to blog about this topic, most likely addressing a concrete navigation service that may be used with DNN next.  Stay tuned!</p>
<p>B</p>



Share on:


	<a rel="nofollow" id="digg" href="javascript:window.location='http%3A%2F%2Fdigg.com%2Fsubmit%3Fphase%3D2%26amp%3Burl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F07%252F22%252Fconfiguring-custom-inavigationservice-in-wcsf-contrib-library-updated%252F%26amp%3Btitle%3DConfiguring%2520custom%2520INavigationService%2520in%2520WCSF%2520Contrib%2520library%2520%2528Updated%2529%26amp%3Bbodytext%3DI%2520recently%2520wrote%2520about%2520implementing%2520a%2520custom%2520PageFlow%2520navigation%2520provider%2520in%2520the%2520WCSF%2520library.%25C2%25A0%2520Since%2520then%252C%2520the%2520patterns%2520team%2520has%2520broken%2520out%2520the%2520PageFlow%2520block%2520into%2520a%2520separate%2520package%2520%2528formally%2520the%2520%2522Patterns%2520%2526amp%253B%2520Practices%253A%2520Web%2520Client%2520Software%2520Fact';" title="Digg"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow" id="del.icio.us" href="javascript:window.location='http%3A%2F%2Fdelicious.com%2Fpost%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F07%252F22%252Fconfiguring-custom-inavigationservice-in-wcsf-contrib-library-updated%252F%26amp%3Btitle%3DConfiguring%2520custom%2520INavigationService%2520in%2520WCSF%2520Contrib%2520library%2520%2528Updated%2529%26amp%3Bnotes%3DI%2520recently%2520wrote%2520about%2520implementing%2520a%2520custom%2520PageFlow%2520navigation%2520provider%2520in%2520the%2520WCSF%2520library.%25C2%25A0%2520Since%2520then%252C%2520the%2520patterns%2520team%2520has%2520broken%2520out%2520the%2520PageFlow%2520block%2520into%2520a%2520separate%2520package%2520%2528formally%2520the%2520%2522Patterns%2520%2526amp%253B%2520Practices%253A%2520Web%2520Client%2520Software%2520Fact';" title="del.icio.us"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow" id="facebook" href="javascript:window.location='http%3A%2F%2Fwww.facebook.com%2Fshare.php%3Fu%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F07%252F22%252Fconfiguring-custom-inavigationservice-in-wcsf-contrib-library-updated%252F%26amp%3Bt%3DConfiguring%2520custom%2520INavigationService%2520in%2520WCSF%2520Contrib%2520library%2520%2528Updated%2529';" title="Facebook"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow" id="google" href="javascript:window.location='http%3A%2F%2Fwww.google.com%2Fbookmarks%2Fmark%3Fop%3Dedit%26amp%3Bbkmk%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F07%252F22%252Fconfiguring-custom-inavigationservice-in-wcsf-contrib-library-updated%252F%26amp%3Btitle%3DConfiguring%2520custom%2520INavigationService%2520in%2520WCSF%2520Contrib%2520library%2520%2528Updated%2529%26amp%3Bannotation%3DI%2520recently%2520wrote%2520about%2520implementing%2520a%2520custom%2520PageFlow%2520navigation%2520provider%2520in%2520the%2520WCSF%2520library.%25C2%25A0%2520Since%2520then%252C%2520the%2520patterns%2520team%2520has%2520broken%2520out%2520the%2520PageFlow%2520block%2520into%2520a%2520separate%2520package%2520%2528formally%2520the%2520%2522Patterns%2520%2526amp%253B%2520Practices%253A%2520Web%2520Client%2520Software%2520Fact';" title="Google Bookmarks"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow" id="dotnetkicks" href="javascript:window.location='http%3A%2F%2Fwww.dotnetkicks.com%2Fkick%2F%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F07%252F22%252Fconfiguring-custom-inavigationservice-in-wcsf-contrib-library-updated%252F%26amp%3Btitle%3DConfiguring%2520custom%2520INavigationService%2520in%2520WCSF%2520Contrib%2520library%2520%2528Updated%2529';" title="DotNetKicks"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/dotnetkicks.png" title="DotNetKicks" alt="DotNetKicks" class="sociable-hovers" /></a>
	<img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/linkedin.png" title="LinkedIn" alt="LinkedIn" class="sociable-hovers" /></a>
	<a rel="nofollow" id="stumbleupon" href="javascript:window.location='http%3A%2F%2Fwww.stumbleupon.com%2Fsubmit%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F07%252F22%252Fconfiguring-custom-inavigationservice-in-wcsf-contrib-library-updated%252F%26amp%3Btitle%3DConfiguring%2520custom%2520INavigationService%2520in%2520WCSF%2520Contrib%2520library%2520%2528Updated%2529';" title="StumbleUpon"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/stumbleupon.png" title="StumbleUpon" alt="StumbleUpon" class="sociable-hovers" /></a>
	<a rel="nofollow" id="technorati" href="javascript:window.location='http%3A%2F%2Ftechnorati.com%2Ffaves%3Fadd%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F07%252F22%252Fconfiguring-custom-inavigationservice-in-wcsf-contrib-library-updated%252F';" title="Technorati"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/technorati.png" title="Technorati" alt="Technorati" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://blogs.law.harvard.edu/brandonhaynes/2008/07/22/configuring-custom-inavigationservice-in-wcsf-contrib-library-updated/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-sa/3.0/us/</creativeCommons:license>
	</item>
		<item>
		<title>Enhanced DotNetNuke Debugging with Debug-Build Assemblies (Updated for 5.0.1)</title>
		<link>http://blogs.law.harvard.edu/brandonhaynes/2008/07/21/enhanced-dotnetnuke-debugging-with-debug-build-assemblies-updated-for-49/</link>
		<comments>http://blogs.law.harvard.edu/brandonhaynes/2008/07/21/enhanced-dotnetnuke-debugging-with-debug-build-assemblies-updated-for-49/#comments</comments>
		<pubDate>Mon, 21 Jul 2008 16:50:00 +0000</pubDate>
		<dc:creator>Brandon Haynes</dc:creator>
				<category><![CDATA[DotNetNuke (DNN) Content Management System]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Debugging]]></category>
		<category><![CDATA[DotNetNuke]]></category>

		<guid isPermaLink="false">http://everysport.net/GamePlan3/Default.aspx?tabid=489&amp;EntryID=10</guid>
		<description><![CDATA[In my previous post, I discussed my reasons and motivations behind providing DotNetNuke assemblies with debug symbols to the general public.  Herein, visitors will find links to those files and instructions for generating a call stack with file names and line numbers.
 
Instructions for using debug assemblies

Back up your entire DotNetNuke installation, including ALL files and databases.  You [...]]]></description>
			<content:encoded><![CDATA[<p>In my <a href="http://blogs.law.harvard.edu/brandonhaynes/2008/07/21/debugging-difficult-exceptions-in-dotnetnuke/">previous post</a>, I discussed my reasons and motivations behind providing DotNetNuke assemblies with debug symbols to the general public.  Herein, visitors will find links to those files and instructions for generating a call stack with file names and line numbers.</p>
<p> </p>
<h3>Instructions for using debug assemblies</h3>
<ol>
<li>Back up your entire DotNetNuke installation, including ALL files and databases.  <em><strong>You will especially need copies of your core production assemblies, because they will need to be restored after debugging is complete.  </strong></em>I recommend executing these steps on a non-production machine.</li>
<li>By downloading any files from this site, you must agree to the following (in addition to any subsequent licensing agreements below):</li>
</ol>
<blockquote><p>THIS SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</p></blockquote>
<ol>
<li>Download relevant files below, and copy them into the bin directory of your DotNetNuke installation (i.e.; if you are having trouble with httpModule functionality, you need only to download DotNetNuke.HttpModules.dll).</li>
<li>Navigate to your DotNetNuke site, and reproduce the error.</li>
<li>Locate the relevant exception in your event viewer (while logged in as an Administrator, select Admin-&gt;Event Viewer and click on the most recent exception).</li>
<li>Ensure that you’re actually generating a call stack with filenames and line numbers (see below: How do I know if it worked?)</li>
<li>Copy and paste this exception, along with background information, into your request for help on the DotNetNuke forums.</li>
<li>Restore your backed-up assemblies over the assemblies you downloaded here.  This is important — debug builds are significantly slower than their production counterparts.  You may optionally choose to remove the .pdb files; they are not required for release functionality, and are ignored.</li>
<li>Navigate to your website and ensure continued functionality.</li>
</ol>
<h3>Downloads</h3>
<p>DotNetNuke licensing guidelines require that I provide the following verbiage.  Note that downloading any of the assemblies provided below indicates binding consent to these terms. </p>
<blockquote><p>DotNetNuke is provided free, as open-source software, and licensed under a BSD-style agreement.  The licensing agreement reads as follows: </p>
<p>DotNetNuke® - <a href="http://www.dotnetnuke.com/"><span>http://www.dotnetnuke.com</span></a><br />
Copyright (C) 2002-2008<br />
by DotNetNuke Corporation</p>
<p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:</p>
<p>The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.</p>
<p>THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</p></blockquote>
<p>Debug-build assemblies:</p>
<ul>
<li><span><a href="http://brandonhaynes.org/Downloads/DotNetNuke.5.0.1.zip">DotNetNuke.dll</a> (5.0.1)</span></li>
<li><span><a href="http://brandonhaynes.org/Downloads/DotNetNuke.HttpModules.5.0.1.zip">DotNetNuke.HttpModules.dll</a> (5.0.1)</span></li>
<li><span><a href="http://brandonhaynes.org/Downloads/DotNetNuke.4.9.2.zip">DotNetNuke.dll</a> (4.9.2)</span></li>
<li><span><a href="http://brandonhaynes.org/Downloads/DotNetNuke.HttpModules.4.9.2.zip">DotNetNuke.HttpModules.dll</a> (4.9.2)</span></li>
<li><span><span><a href="http://brandonhaynes.org/Downloads/DotNetNuke.4.9.zip">DotNetNuke.dll</a></span></span>(4.9)</li>
<li><a href="http://brandonhaynes.org/Downloads/DotNetNuke.HttpModules.4.9.zip"><span><span>DotNetNuke.HttpModules.dll</span></span></a> (4.9)</li>
<li><a href="http://brandonhaynes.org/Downloads/DotNetNuke.4.8.4.zip"><span>DotNetNuke.dll</span></a> (4.8.4)</li>
<li><a href="http://brandonhaynes.org/Downloads/DotNetNuke.HttpModules.4.8.4.zip"><span>DotNetNuke.HttpModules.dll</span></a> (4.8.4)</li>
</ul>
<p> </p>
<h3>How do I know if it worked?</h3>
<p>Call stacks involving assemblies with debug information will read similar to the following:</p>
<blockquote><p>System.Net.Mail.SmtpException: The operation has timed out. at <a title="http://System." href="http://system.net/" target="_blank">System.Net</a>.Mail.SmtpClient.Send(MailMessage message) at DotNetNuke.Services.Mail.Mail.SendMail(String MailFrom, String MailTo, String Cc, String Bcc, String ReplyTo, MailPriority Priority, String Subject, MailFormat BodyFormat, Encoding BodyEncoding, String Body, String[] Attachment, String SMTPServer, String SMTPAuthentication, String SMTPUsername, String SMTPPassword, Boolean SMTPEnableSSL) in <strong>C:\…\DotNetNuke\Library\Components\Mail\Mail.vb:line 315</strong></p></blockquote>
<p>Note that the filename(s) and line number(s) (highlighted above) are present in the call stack.  This additional information is what you are looking to provide to those assisting.</p>
<h3>Final Words</h3>
<p>I have tested this procedure on a local DotNetNuke deployment, and it appears to work correctly.  However, I would appreciate feedback from those using this method in the wild, and especially how I might clarify the instructions to be more accessible to less experienced users and developers.</p>
<p>I hope this helps those out there with difficult-to-diagnose DotNetNuke issues!</p>
<p>B</p>



Share on:


	<a rel="nofollow" id="digg" href="javascript:window.location='http%3A%2F%2Fdigg.com%2Fsubmit%3Fphase%3D2%26amp%3Burl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F07%252F21%252Fenhanced-dotnetnuke-debugging-with-debug-build-assemblies-updated-for-49%252F%26amp%3Btitle%3DEnhanced%2520DotNetNuke%2520Debugging%2520with%2520Debug-Build%2520Assemblies%2520%2528Updated%2520for%25205.0.1%2529%26amp%3Bbodytext%3DIn%2520my%25C2%25A0previous%2520post%252C%2520I%2520discussed%2520my%2520reasons%2520and%2520motivations%2520behind%2520providing%2520DotNetNuke%2520assemblies%2520with%2520debug%2520symbols%2520to%2520the%2520general%2520public.%25C2%25A0%2520Herein%252C%2520visitors%2520will%2520find%2520links%2520to%2520those%2520files%2520and%2520instructions%2520for%2520generating%2520a%2520call%2520stack%2520with%2520file%2520nam';" title="Digg"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow" id="del.icio.us" href="javascript:window.location='http%3A%2F%2Fdelicious.com%2Fpost%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F07%252F21%252Fenhanced-dotnetnuke-debugging-with-debug-build-assemblies-updated-for-49%252F%26amp%3Btitle%3DEnhanced%2520DotNetNuke%2520Debugging%2520with%2520Debug-Build%2520Assemblies%2520%2528Updated%2520for%25205.0.1%2529%26amp%3Bnotes%3DIn%2520my%25C2%25A0previous%2520post%252C%2520I%2520discussed%2520my%2520reasons%2520and%2520motivations%2520behind%2520providing%2520DotNetNuke%2520assemblies%2520with%2520debug%2520symbols%2520to%2520the%2520general%2520public.%25C2%25A0%2520Herein%252C%2520visitors%2520will%2520find%2520links%2520to%2520those%2520files%2520and%2520instructions%2520for%2520generating%2520a%2520call%2520stack%2520with%2520file%2520nam';" title="del.icio.us"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow" id="facebook" href="javascript:window.location='http%3A%2F%2Fwww.facebook.com%2Fshare.php%3Fu%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F07%252F21%252Fenhanced-dotnetnuke-debugging-with-debug-build-assemblies-updated-for-49%252F%26amp%3Bt%3DEnhanced%2520DotNetNuke%2520Debugging%2520with%2520Debug-Build%2520Assemblies%2520%2528Updated%2520for%25205.0.1%2529';" title="Facebook"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow" id="google" href="javascript:window.location='http%3A%2F%2Fwww.google.com%2Fbookmarks%2Fmark%3Fop%3Dedit%26amp%3Bbkmk%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F07%252F21%252Fenhanced-dotnetnuke-debugging-with-debug-build-assemblies-updated-for-49%252F%26amp%3Btitle%3DEnhanced%2520DotNetNuke%2520Debugging%2520with%2520Debug-Build%2520Assemblies%2520%2528Updated%2520for%25205.0.1%2529%26amp%3Bannotation%3DIn%2520my%25C2%25A0previous%2520post%252C%2520I%2520discussed%2520my%2520reasons%2520and%2520motivations%2520behind%2520providing%2520DotNetNuke%2520assemblies%2520with%2520debug%2520symbols%2520to%2520the%2520general%2520public.%25C2%25A0%2520Herein%252C%2520visitors%2520will%2520find%2520links%2520to%2520those%2520files%2520and%2520instructions%2520for%2520generating%2520a%2520call%2520stack%2520with%2520file%2520nam';" title="Google Bookmarks"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow" id="dotnetkicks" href="javascript:window.location='http%3A%2F%2Fwww.dotnetkicks.com%2Fkick%2F%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F07%252F21%252Fenhanced-dotnetnuke-debugging-with-debug-build-assemblies-updated-for-49%252F%26amp%3Btitle%3DEnhanced%2520DotNetNuke%2520Debugging%2520with%2520Debug-Build%2520Assemblies%2520%2528Updated%2520for%25205.0.1%2529';" title="DotNetKicks"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/dotnetkicks.png" title="DotNetKicks" alt="DotNetKicks" class="sociable-hovers" /></a>
	<img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/linkedin.png" title="LinkedIn" alt="LinkedIn" class="sociable-hovers" /></a>
	<a rel="nofollow" id="stumbleupon" href="javascript:window.location='http%3A%2F%2Fwww.stumbleupon.com%2Fsubmit%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F07%252F21%252Fenhanced-dotnetnuke-debugging-with-debug-build-assemblies-updated-for-49%252F%26amp%3Btitle%3DEnhanced%2520DotNetNuke%2520Debugging%2520with%2520Debug-Build%2520Assemblies%2520%2528Updated%2520for%25205.0.1%2529';" title="StumbleUpon"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/stumbleupon.png" title="StumbleUpon" alt="StumbleUpon" class="sociable-hovers" /></a>
	<a rel="nofollow" id="technorati" href="javascript:window.location='http%3A%2F%2Ftechnorati.com%2Ffaves%3Fadd%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F07%252F21%252Fenhanced-dotnetnuke-debugging-with-debug-build-assemblies-updated-for-49%252F';" title="Technorati"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/technorati.png" title="Technorati" alt="Technorati" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://blogs.law.harvard.edu/brandonhaynes/2008/07/21/enhanced-dotnetnuke-debugging-with-debug-build-assemblies-updated-for-49/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-sa/3.0/us/</creativeCommons:license>
	</item>
		<item>
		<title>Debugging Difficult Exceptions in DotNetNuke</title>
		<link>http://blogs.law.harvard.edu/brandonhaynes/2008/07/21/debugging-difficult-exceptions-in-dotnetnuke/</link>
		<comments>http://blogs.law.harvard.edu/brandonhaynes/2008/07/21/debugging-difficult-exceptions-in-dotnetnuke/#comments</comments>
		<pubDate>Mon, 21 Jul 2008 16:43:00 +0000</pubDate>
		<dc:creator>Brandon Haynes</dc:creator>
				<category><![CDATA[DotNetNuke (DNN) Content Management System]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Debugging]]></category>
		<category><![CDATA[DotNetNuke]]></category>

		<guid isPermaLink="false">http://everysport.net/GamePlan3/Default.aspx?tabid=489&amp;EntryID=9</guid>
		<description><![CDATA[During my time working with DotNetNuke, I have encountered innumerable forum posts in the following general form:
I&#8217;m getting a very vague general exception error, and I&#8217;m not sure what is causing it.  There doesn&#8217;t seem to be anything visible in the application . . . [and] no errors as I&#8217;m navigating the site. Any and all [...]]]></description>
			<content:encoded><![CDATA[<p>During my time working with DotNetNuke, I have encountered <a href="http://www.dotnetnuke.com/Community/Forums/tabid/795/body/stacktrace/subject/stacktrace/scope/threadsearch/Default.aspx"><span style="color: #669966">innumerable forum posts</span></a> in the following general form:</p>
<blockquote><p><span style="font-family: Courier">I&#8217;m getting a very vague general exception error, and I&#8217;m not sure what is causing it.  There doesn&#8217;t seem to be anything visible in the application . . . [and] no errors as I&#8217;m navigating the site. Any and all help is greatly appreciated!</span></p>
<p><span style="font-family: Courier"><strong>StackTrace</strong>: </span>[NullReferenceException: Object reference not set to an instance of an object.]<br />
   DotNetNuke.UI.Skins.SkinDefaults..ctor(SkinDefaultType DefaultType) +189<br />
   DotNetNuke .Common.Globals.get_DefaultSkin() +31<br />
   DotNetNuke.Entities.Portals.PortalSettings.GetPortalSettings(Int32 TabId, PortalAliasInfo objPortalAliasInfo) +2797<br />
   DotNetNuke.Entities.Portals.PortalSettings..ctor(Int32 tabId, PortalAliasInfo objPortalAliasInfo) +82<br />
   DotNetNuke.HttpModules.UrlRewriteModule.OnBeginRequest(Object s, EventArgs e) +3303<br />
   System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +92<br />
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean&amp; completedSynchronously) +64</p></blockquote>
<p><span style="font-family: tre">Experienced DNN developers will recognize the general area in which the error is occurring (missing skinningDefaults in DotNetNuke.config) and probably some general guidance to rectify the error (check that DotNetNuke.config exists, and correctly contains the proper skinningDefaults element).</span></p>
<p>This is fine for exceptions that occur frequently, but how does an experienced developer guide a novice in finding a solution to this issue?</p>
<blockquote>
<pre>[NullReferenceException: Object reference not set to an instance of an object.]
   DotNetNuke.HttpModules.UrlRewriteModule.RewriteUrl(HttpApplication app) +378
   DotNetNuke.HttpModules.UrlRewriteModule.OnBeginRequest(Object s, EventArgs e) +1180
   System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +92
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean&amp; completedSynchronously) +64</pre>
</blockquote>
<p>Even a sophisticated developer would need to explore several avenues in finding a solution.  Assisting a relatively novice forum user in performing these tasks is problematic &#8212; such assistance would require a number of back-and-forth exchanges.  With regret, I unfortunately observe many problems go unremedied for this reason (as, to date, is the exception <a href="http://www.dotnetnuke.com/Community/Forums/tabid/795/forumid/107/threadid/243084/scope/posts/Default.aspx"><span style="color: #669966">posted</span></a> immediately above).<span id="more-9"></span></p>
<h3>A Better Way to Debug</h3>
<p>Clearly, for difficult-to-diagnose problems, a call stack is not sufficient to identify a solution.  Fortunately, there is a relatively easy way to augment this stack with information that greatly aids in diagnosis &#8212; assemblies with debugging symbols.  A debug build provides line numbers that may be used to target with much greater accuracy the particular problem that a user is experiencing. </p>
<p>For a non-developer experiencing a difficult problem, he or she could replace existing production-build assemblies with their debug-symbol counterparts, reproduce the error, and post the augmented call stack for analysis.  I argue that this would (a) significantly increase error resolution, and (b) decrease debug time per issue for both assistor and assistee.</p>
<p>Unfortunately, at this time the DNN team seems to have <a href="http://www.dotnetnuke.com/Community/Forums/tabid/795/forumid/118/threadid/235914/scope/posts/Default.aspx"><span style="color: #669966">little interest</span></a> in providing such assemblies to the public at large (arguing that users can build these themselves).  I respectfully disagree, and would suggest that most capable of producing such assemblies would not need the additional forum assistance that such the debug builds would allow.</p>
<p>Fortunately, the <a href="http://www.dotnetnuke.com/About/LicensingandTrademarks/tabid/776/Default.aspx"><span style="color: #669966">DotNetNuke license</span></a> allows me to both recompile core assemblies with debug symbols, and to publish these builds to the general public.  I intend to do so, and thereby (hopefully) aid others in solving some of the more difficult problems encountered in the wild.</p>
<p>To this end, my next entry will contain major DotNetNuke assemblies with debugging symbols.  I decided to split off the deployment instructions and downloads into a separate post so that downloading users can skip the preamble and get straight to the instructions and downloads.</p>
<p>For those who have feedback regarding the philosophy and feasibility of this approach, I&#8217;d appreciate both.</p>
<p>B</p>



Share on:


	<a rel="nofollow" id="digg" href="javascript:window.location='http%3A%2F%2Fdigg.com%2Fsubmit%3Fphase%3D2%26amp%3Burl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F07%252F21%252Fdebugging-difficult-exceptions-in-dotnetnuke%252F%26amp%3Btitle%3DDebugging%2520Difficult%2520Exceptions%2520in%2520DotNetNuke%26amp%3Bbodytext%3DDuring%2520my%2520time%2520working%2520with%2520DotNetNuke%252C%2520I%2520have%2520encountered%2520innumerable%2520forum%2520posts%2520in%2520the%2520following%2520general%2520form%253A%250D%250AI%2527m%2520getting%2520a%2520very%2520vague%2520general%2520exception%2520error%252C%2520and%2520I%2527m%2520not%2520sure%2520what%2520is%2520causing%2520it.%25C2%25A0%2520There%2520doesn%2527t%2520seem%2520to%2520be%2520anything%2520visible%2520in%2520t';" title="Digg"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow" id="del.icio.us" href="javascript:window.location='http%3A%2F%2Fdelicious.com%2Fpost%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F07%252F21%252Fdebugging-difficult-exceptions-in-dotnetnuke%252F%26amp%3Btitle%3DDebugging%2520Difficult%2520Exceptions%2520in%2520DotNetNuke%26amp%3Bnotes%3DDuring%2520my%2520time%2520working%2520with%2520DotNetNuke%252C%2520I%2520have%2520encountered%2520innumerable%2520forum%2520posts%2520in%2520the%2520following%2520general%2520form%253A%250D%250AI%2527m%2520getting%2520a%2520very%2520vague%2520general%2520exception%2520error%252C%2520and%2520I%2527m%2520not%2520sure%2520what%2520is%2520causing%2520it.%25C2%25A0%2520There%2520doesn%2527t%2520seem%2520to%2520be%2520anything%2520visible%2520in%2520t';" title="del.icio.us"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow" id="facebook" href="javascript:window.location='http%3A%2F%2Fwww.facebook.com%2Fshare.php%3Fu%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F07%252F21%252Fdebugging-difficult-exceptions-in-dotnetnuke%252F%26amp%3Bt%3DDebugging%2520Difficult%2520Exceptions%2520in%2520DotNetNuke';" title="Facebook"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow" id="google" href="javascript:window.location='http%3A%2F%2Fwww.google.com%2Fbookmarks%2Fmark%3Fop%3Dedit%26amp%3Bbkmk%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F07%252F21%252Fdebugging-difficult-exceptions-in-dotnetnuke%252F%26amp%3Btitle%3DDebugging%2520Difficult%2520Exceptions%2520in%2520DotNetNuke%26amp%3Bannotation%3DDuring%2520my%2520time%2520working%2520with%2520DotNetNuke%252C%2520I%2520have%2520encountered%2520innumerable%2520forum%2520posts%2520in%2520the%2520following%2520general%2520form%253A%250D%250AI%2527m%2520getting%2520a%2520very%2520vague%2520general%2520exception%2520error%252C%2520and%2520I%2527m%2520not%2520sure%2520what%2520is%2520causing%2520it.%25C2%25A0%2520There%2520doesn%2527t%2520seem%2520to%2520be%2520anything%2520visible%2520in%2520t';" title="Google Bookmarks"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow" id="dotnetkicks" href="javascript:window.location='http%3A%2F%2Fwww.dotnetkicks.com%2Fkick%2F%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F07%252F21%252Fdebugging-difficult-exceptions-in-dotnetnuke%252F%26amp%3Btitle%3DDebugging%2520Difficult%2520Exceptions%2520in%2520DotNetNuke';" title="DotNetKicks"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/dotnetkicks.png" title="DotNetKicks" alt="DotNetKicks" class="sociable-hovers" /></a>
	<a rel="nofollow" id="linkedin" href="javascript:window.location='http%3A%2F%2Fwww.linkedin.com%2FshareArticle%3Fmini%3Dtrue%26amp%3Burl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F07%252F21%252Fdebugging-difficult-exceptions-in-dotnetnuke%252F%26amp%3Btitle%3DDebugging%2520Difficult%2520Exceptions%2520in%2520DotNetNuke%26amp%3Bsource%3DFrom%2Bthe%2BDesk%2Bof%2BBrandon%2BHaynes%2BObservations%2Babout%2Bthe%2Bintersection%2Bof%2Btechnology%252C%2Bbusiness%252C%2Band%2Bintellectual%2Bproperty%26amp%3Bsummary%3DDuring%2520my%2520time%2520working%2520with%2520DotNetNuke%252C%2520I%2520have%2520encountered%2520innumerable%2520forum%2520posts%2520in%2520the%2520following%2520general%2520form%253A%250D%250AI%2527m%2520getting%2520a%2520very%2520vague%2520general%2520exception%2520error%252C%2520and%2520I%2527m%2520not%2520sure%2520what%2520is%2520causing%2520it.%25C2%25A0%2520There%2520doesn%2527t%2520seem%2520to%2520be%2520anything%2520visible%2520in%2520t';" title="LinkedIn"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/linkedin.png" title="LinkedIn" alt="LinkedIn" class="sociable-hovers" /></a>
	<a rel="nofollow" id="stumbleupon" href="javascript:window.location='http%3A%2F%2Fwww.stumbleupon.com%2Fsubmit%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F07%252F21%252Fdebugging-difficult-exceptions-in-dotnetnuke%252F%26amp%3Btitle%3DDebugging%2520Difficult%2520Exceptions%2520in%2520DotNetNuke';" title="StumbleUpon"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/stumbleupon.png" title="StumbleUpon" alt="StumbleUpon" class="sociable-hovers" /></a>
	<a rel="nofollow" id="technorati" href="javascript:window.location='http%3A%2F%2Ftechnorati.com%2Ffaves%3Fadd%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F07%252F21%252Fdebugging-difficult-exceptions-in-dotnetnuke%252F';" title="Technorati"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/technorati.png" title="Technorati" alt="Technorati" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://blogs.law.harvard.edu/brandonhaynes/2008/07/21/debugging-difficult-exceptions-in-dotnetnuke/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-sa/3.0/us/</creativeCommons:license>
	</item>
		<item>
		<title>Using Commerce Server&#8217;s UpmMembershipProvider with DotNetNuke</title>
		<link>http://blogs.law.harvard.edu/brandonhaynes/2008/04/27/using-commerce-servers-upmmembershipprovider-with-dotnetnuke/</link>
		<comments>http://blogs.law.harvard.edu/brandonhaynes/2008/04/27/using-commerce-servers-upmmembershipprovider-with-dotnetnuke/#comments</comments>
		<pubDate>Sun, 27 Apr 2008 19:04:00 +0000</pubDate>
		<dc:creator>Brandon Haynes</dc:creator>
				<category><![CDATA[DotNetNuke (DNN) Content Management System]]></category>
		<category><![CDATA[Microsoft Commerce Server]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Commerce Server]]></category>
		<category><![CDATA[Commerce Server 2007]]></category>
		<category><![CDATA[DotNetNuke]]></category>
		<category><![CDATA[UpmMembershipProvider]]></category>

		<guid isPermaLink="false">http://everysport.net/GamePlan3/Default.aspx?tabid=489&amp;EntryID=7</guid>
		<description><![CDATA[For those that are not familiar with the UpmMembershipProvider membership provider, it is a part of Microsoft&#8217;s Commerce Server 2007 product, and is the only provider that offers interoperability with Commerce Server.  It replaces the older AuthManager functionality from Commerce Server 2002.  More importantly, it provides an implementation of the System.Web.Membership.MembershipProvider class, and may thus [...]]]></description>
			<content:encoded><![CDATA[<p>For those that are not familiar with the UpmMembershipProvider membership provider, it is a part of Microsoft&#8217;s Commerce Server 2007 product, and is the only provider that offers interoperability with Commerce Server.  It replaces the older AuthManager functionality from Commerce Server 2002.  More importantly, it provides an implementation of the System.Web.Membership.MembershipProvider class, and may thus be used in any&nbsp;<a href="http://ASP.NET" title="http://ASP. " target="_blank">ASP.NET</a> application that utilizes the standard membership system.  Read more about the UpmMembershipProvider in <a href="http://msdn2.microsoft.com/en-us/library/microsoft.commerceserver.runtime.profiles.upmmembershipprovider.aspx"><span style="color: #669966">Microsoft&#8217;s MSDN documentation</span></a>.</p>
<p><a href="http://www.dotnetnuke.com/"><span style="color: #669966">DotNetNuke</span></a> (DNN) is one such application that uses the&nbsp;<a href="http://ASP.NET" title="http://ASP. " target="_blank">ASP.NET</a> membership system.  Because I&#8217;ve been working so much with it lately, I decided to investigate whether these two strangers might be successfully introduced &#8212; and indeed they can.  <a href="http://www.google.com/search?q=UpmMembershipProvider+DotNetNuke&amp;rls=com.microsoft:en-us&amp;ie=UTF-8&amp;oe=UTF-8&amp;startIndex=&amp;startPage=1"><span style="color: #669966">Google</span></a> tells me that I am the only person to date who has successfully accomplished this task (not that surprising, given its relatively esoteric nature).</p>
<p>It turns out that this integration consists of three tasks: (1) configuring Commerce Server appropriately, (2) the routine tasks that one would expect in using the new provider, (3) and a small integration <a href="http://en.wikipedia.org/wiki/Gotcha_%28programming%29"><span style="color: #669966">gotcha</span></a>.  Herein I address these in order.<span id="more-11"></span></p>
<h2>Configuring Commerce Server</h2>
<p>Commerce Server uses the GeneralInfo.email_address value of the UserObject profile object by default for authentication.  This is great, except that DotNetNuke uses a generic login name during registration.  While it&#8217;s possible to configure DNN to use e-mail addresses throughout its registration system, that&#8217;s a topic for a later date and beyond the scope of the task at hand.</p>
<p>We are thus forced to move Commerce Server away from e-mail addresses in favor of a more generic login name.  If you haven&#8217;t already configured your Commerce Server installation to use such a login name, you&#8217;ll need to do so.  Amy describes this process in her newsgroup post <a href="http://groups.google.com.sg/group/microsoft.public.commerceserver.general/msg/dae61f2735df12d2?dmode=source&amp;hl=en"><span style="color: #669966">here</span></a>.  Thanks Amy!</p>
<h2>Web.Config Integration</h2>
<p>Most developers will know that the first task in installing a new provider is updating the application&#8217;s web.config file with details about the provider.  Accordingly, we add the following to our web.config:</p>
<pre>        <span class="kwrd">&lt;</span><span class="html">membership</span> <span class="attr">defaultProvider</span><span class="kwrd">="UpmMembershipProviderAdapter"</span>
                    <span class="attr">userIsOnlineTimeWindow</span><span class="kwrd">="15"</span><span class="kwrd">&gt;</span>
            <span class="kwrd">&lt;</span><span class="html">providers</span><span class="kwrd">&gt;</span>
                <span class="kwrd">&lt;</span><span class="html">clear</span><span class="kwrd">/&gt;</span>
                <span class="kwrd">&lt;</span><span class="html">add</span> <span class="attr">name</span><span class="kwrd">="UpmMembershipProviderAdapter"</span>
                     <span class="attr">enablePasswordReset</span><span class="kwrd">="true"</span>
                     <span class="attr">logonNameProperty</span><span class="kwrd">="GeneralInfo.login_name"</span>
                     <span class="attr">enableCreateDate</span><span class="kwrd">="true"</span>
                     <span class="attr">enableEmailAddress</span><span class="kwrd">="true"</span>
                     <span class="attr">enableLastLoginDate</span><span class="kwrd">="true"</span>
                     <span class="attr">profileDefinition</span><span class="kwrd">="UserObject"</span>
                     <span class="attr">requiresApproval</span><span class="kwrd">="true"</span>
                     <span class="attr">minRequiredPasswordLength</span><span class="kwrd">="5"</span>
                     <span class="attr">minRequiredNonalphanumericCharacters</span><span class="kwrd">="0"</span>
                     <span class="attr">maxInvalidPasswordAttempts</span><span class="kwrd">="5"</span>
                     <span class="attr">passwordAttemptWindows</span><span class="kwrd">="15"</span>
                     <span class="attr">passwordLockoutPeriod</span><span class="kwrd">="10"</span>
                    <span class="attr">type</span><span class="kwrd">="<strong>BrandonHaynes.Membership.UpmMembershipProviderAdapter</strong>"</span><span class="kwrd">/&gt;</span>
            <span class="kwrd">&lt;/</span><span class="html">providers</span><span class="kwrd">&gt;</span>
        <span class="kwrd">&lt;/</span><span class="html">membership</span><span class="kwrd">&gt;</span></pre>
<p>Two comments about this entry:</p>
<ol>
<li>Most attributes are straightforward and default here, including: enablePasswordReset, loginNameProperty, enableCreateDate, enableEmailAddress, enableLastLoginDate, profileDefinition.  Note that the UpmMembershipProvider does not support many of the attributes available in the AspNetSqlMembershipProvider; see the <a href="http://msdn2.microsoft.com/en-us/library/ms917174.aspx"><span style="color: #669966">MSDN documentation</span></a> for more details.  This can be a source of frustration, as the provider does not complain when an unsupported attribute is supplied.</li>
<li>I did not directly use the UpmMembershipProvider class located in the&nbsp;<a href="http://Microsoft.Com" title="http://Microsoft. " target="_blank">Microsoft.Com</a>merceServer.Runtime assembly.  The reason for this is discussed below as a <a href="http://en.wikipedia.org/wiki/Gotcha_%28programming%29"><span style="color: #669966">gotcha</span></a>.</li>
</ol>
<p>Additionally, you&#8217;ll need to copy over all the required Commerce Server files to your DNN installation.  These can come from the StarterSite or CSharpSite (obviously this choice will impact your mappings, and any production application will likely have customized these files).  These files include:</p>
<blockquote>
<ul>
<li>All files in the pipelines subdirectory</li>
<li>bin/CommerceMessageManager.dll,</li>
<li>The de-DE, EN, en-us, fr-fr, and ja-JP subdirectories of the bin folder.</li>
<li>OrderObjectMappings.xml</li>
<li>OrderPipelineMappings.xml</li>
<li>csapp.ini</li>
</ul>
</blockquote>
<p>Naturally, the default DotNetNuke web.config must have the required Commerce Server sections added.  This includes {sectionGroup[@name = 'CommerceServer'], compilation/assemblies, system.web/httpModules, and  CommerceServer} elements.  Look to the Commerce Server SDK StarterSite for a model web.config, or use the one that I provide below.</p>
<p>That&#8217;s it with the trivial part.  Not so bad at all!</p>
<h2>Adapting the Provider</h2>
<p>As mentioned above, the UpmMembershipProvider does not support some of the configuration properties available in its MembershipProvider base class, and throws a NotSupportedException when any of these methods/properties are called.  Unfortunately, DotNetNuke makes calls to one of these unsupported properties &#8212; PasswordQuestion &#8212; regardless of the provider configuration.  Without modifying the core, there is no way to declaratively remedy this problem.</p>
<p>Because of this issue, we are forced to <a href="http://en.wikipedia.org/wiki/Decorator_pattern"><span style="color: #669966">decorate</span></a> the UpmMembershipUser object so that it does not throw, and <a href="http://en.wikipedia.org/wiki/Adapter_pattern"><span style="color: #669966">adapt</span></a> the UpmMembershipProvider such that it returns our newly decorated user objects.</p>
<h3>Decorating the UpmMembershipUser</h3>
<p>Our <a href="http://en.wikipedia.org/wiki/Decorator_pattern"><span style="color: #669966">decoration</span></a> is very straightforward and by-the-book:</p>
<pre>    <span class="kwrd">class</span> UpmMembershipUserAdapterDecorator : MembershipUser
        {
        <span class="kwrd">private</span> MembershipUser decoratedMembershipUser;

        <span class="kwrd">internal</span> UpmMembershipUserAdapterDecorator(MembershipUser decoratedMembershipUser)
            {
            <span class="kwrd">this</span>.decoratedMembershipUser = decoratedMembershipUser;
            }

        <span class="kwrd">internal</span> MembershipUser DecoratedMembershipUser
            {
            get { <span class="kwrd">return</span> decoratedMembershipUser; }
            }

        <span class="preproc">#region</span> Decorated Overrides

<strong>        <span class="kwrd">public</span> <span class="kwrd">override</span> <span class="kwrd">string</span> PasswordQuestion
            {
            get
                {
                <span class="kwrd">if</span> (System.Web.Security.Membership.Providers[decoratedMembershipUser.ProviderName].RequiresQuestionAndAnswer)
                    <span class="kwrd">return</span> decoratedMembershipUser.PasswordQuestion;
                <span class="kwrd">else</span>
                    <span class="kwrd">return</span> <span class="kwrd">null</span>;
                }
            }
</strong>        <span class="preproc">#endregion</span>

        <span class="preproc">#region</span> Delegated Overrides ...
        }</pre>
<p>Here we decorate the PasswordQuestion property such that it relies on base implementation when RequiresQuestionAndAnswer is activated in the web.config, and null if it is unsupported (instead of throwing).  The &#8220;Delegated Overrides&#8221; region implements the rest of the MembershipUser methods, passing the call to the decorated MembershipUser as per the pattern.</p>
<h3></h3>
<h3>Adapting the UpmMembershipProvider</h3>
<p>Next, we <a href="http://en.wikipedia.org/wiki/Adapter_pattern"><span style="color: #669966">adapt</span></a> the UpmMembershipProvider class so that it returns DecoratedMembershipUsers (instead of UpmMembershpUsers):</p>
<pre>    <span class="kwrd">public</span> <span class="kwrd">class</span> UpmMembershipProviderAdapter : UpmMembershipProvider
        {
        <span class="kwrd">public</span> UpmMembershipProviderAdapter() : <span class="kwrd">base</span>() { }

        <span class="preproc">#region</span> Overridden Functions

        <span class="kwrd">public</span> <span class="kwrd">override</span> MembershipUser CreateUser(<span class="kwrd">string</span> username, <span class="kwrd">string</span> password,
        <span class="kwrd">string</span> email, <span class="kwrd">string</span> passwordQuestion, <span class="kwrd">string</span> passwordAnswer, <span class="kwrd">bool</span> isApproved,
        <span class="kwrd">object</span> providerUserKey, <span class="kwrd">out</span> MembershipCreateStatus status)
            {
            <span class="kwrd">return</span> DecorateUser(<span class="kwrd">base</span>.CreateUser(username, password, email,
                 passwordQuestion, passwordAnswer, isApproved, providerUserKey,
                <span class="kwrd">out</span> status));
            }

        <span class="kwrd">public</span> <span class="kwrd">override</span> MembershipUser GetUser(<span class="kwrd">object</span> providerUserKey, <span class="kwrd">bool</span> userIsOnline)
            {
            <span class="kwrd">return</span> DecorateUser(<span class="kwrd">base</span>.GetUser(providerUserKey, userIsOnline));
            }

        <span class="kwrd">public</span> <span class="kwrd">override</span> MembershipUser GetUser(<span class="kwrd">string</span> username, <span class="kwrd">bool</span> userIsOnline)
            {
            <span class="kwrd">return</span> DecorateUser(<span class="kwrd">base</span>.GetUser(username, userIsOnline));
            }

        <span class="kwrd">public</span> <span class="kwrd">override</span> <span class="kwrd">void</span> UpdateUser(MembershipUser user)
            {
            <span class="kwrd">base</span>.UpdateUser(ExtractDecoratedUser(user));
            }
        <span class="preproc">#endregion</span>

        <span class="preproc">#region</span> Private Functions

        <span class="kwrd">private</span> <span class="kwrd">static</span> MembershipUser DecorateUser(MembershipUser decoratedUser)
            {
            <span class="kwrd">if</span> (decoratedUser != <span class="kwrd">null</span>)
                decoratedUser =
                <span class="kwrd">new</span> UpmMembershipUserAdapterDecorator(decoratedUser);

            <span class="kwrd">return</span> decoratedUser;
            }

        <span class="kwrd">private</span> <span class="kwrd">static</span> MembershipUser ExtractDecoratedUser(MembershipUser user)
            {
            UpmMembershipUserAdapterDecorator decoratedUser =
                user <span class="kwrd">as</span> UpmMembershipUserAdapterDecorator;

            <span class="kwrd">if</span> (decoratedUser != <span class="kwrd">null</span>)
                user = decoratedUser.DecoratedMembershipUser;

            <span class="kwrd">return</span> user;
            }

        <span class="preproc">#endregion</span>
        }</pre>
<p>This adaptation is also very straightforward.  The methods that return MembershipUsers (CreateUser, GetUser, UpdateUser) decorate the UpmMembershipUser returned by the base implementation.  Note that I included a private ExtractDecoratedUser helper function to aid in debugging, but as it is not called internally it may be safely omitted at a developer&#8217;s discretion.</p>
<h2></h2>
<h2>Closing Comments</h2>
<p>Despite a few configuration hassles, coaxing the UpmMembershipProvider to play nicely with DotNetNuke was surprisingly easy.  I&#8217;ve made the relevant files available as a download for anyone desiring to duplicate this integration.</p>
<p>I&#8217;d appreciate feedback and comments (and of course questions!) for anyone who chooses to duplicate my efforts.  Good luck!</p>
<p>B</p>
<h3>Attachments</h3>
<ul>
<li><a href="http://brandonhaynes.org/Downloads/UpmMembershipProvider/BrandonHaynes.Integration Web.Config for DNN 4.8.1.zip">Integration Sample web.config for UpmMembershipAdapter and DotNetNuke</a></li>
<li><a href="http://brandonhaynes.org/Downloads/UpmMembershipProvider/BrandonHaynes.UpmMembershipProviderAdapter.zip">UpmMembershipProviderAdapter C# Project</a></li>
</ul>



Share on:


	<a rel="nofollow" id="digg" href="javascript:window.location='http%3A%2F%2Fdigg.com%2Fsubmit%3Fphase%3D2%26amp%3Burl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F04%252F27%252Fusing-commerce-servers-upmmembershipprovider-with-dotnetnuke%252F%26amp%3Btitle%3DUsing%2520Commerce%2520Server%2527s%2520UpmMembershipProvider%2520with%2520DotNetNuke%26amp%3Bbodytext%3DFor%2520those%2520that%2520are%2520not%2520familiar%2520with%2520the%2520UpmMembershipProvider%2520membership%2520provider%252C%2520it%2520is%2520a%2520part%2520of%2520Microsoft%2527s%2520Commerce%2520Server%25202007%2520product%252C%2520and%2520is%2520the%2520only%2520provider%2520that%2520offers%2520interoperability%2520with%2520Commerce%2520Server.%25C2%25A0%2520It%2520replaces%2520the%2520older%2520AuthMana';" title="Digg"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow" id="del.icio.us" href="javascript:window.location='http%3A%2F%2Fdelicious.com%2Fpost%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F04%252F27%252Fusing-commerce-servers-upmmembershipprovider-with-dotnetnuke%252F%26amp%3Btitle%3DUsing%2520Commerce%2520Server%2527s%2520UpmMembershipProvider%2520with%2520DotNetNuke%26amp%3Bnotes%3DFor%2520those%2520that%2520are%2520not%2520familiar%2520with%2520the%2520UpmMembershipProvider%2520membership%2520provider%252C%2520it%2520is%2520a%2520part%2520of%2520Microsoft%2527s%2520Commerce%2520Server%25202007%2520product%252C%2520and%2520is%2520the%2520only%2520provider%2520that%2520offers%2520interoperability%2520with%2520Commerce%2520Server.%25C2%25A0%2520It%2520replaces%2520the%2520older%2520AuthMana';" title="del.icio.us"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow" id="facebook" href="javascript:window.location='http%3A%2F%2Fwww.facebook.com%2Fshare.php%3Fu%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F04%252F27%252Fusing-commerce-servers-upmmembershipprovider-with-dotnetnuke%252F%26amp%3Bt%3DUsing%2520Commerce%2520Server%2527s%2520UpmMembershipProvider%2520with%2520DotNetNuke';" title="Facebook"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow" id="google" href="javascript:window.location='http%3A%2F%2Fwww.google.com%2Fbookmarks%2Fmark%3Fop%3Dedit%26amp%3Bbkmk%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F04%252F27%252Fusing-commerce-servers-upmmembershipprovider-with-dotnetnuke%252F%26amp%3Btitle%3DUsing%2520Commerce%2520Server%2527s%2520UpmMembershipProvider%2520with%2520DotNetNuke%26amp%3Bannotation%3DFor%2520those%2520that%2520are%2520not%2520familiar%2520with%2520the%2520UpmMembershipProvider%2520membership%2520provider%252C%2520it%2520is%2520a%2520part%2520of%2520Microsoft%2527s%2520Commerce%2520Server%25202007%2520product%252C%2520and%2520is%2520the%2520only%2520provider%2520that%2520offers%2520interoperability%2520with%2520Commerce%2520Server.%25C2%25A0%2520It%2520replaces%2520the%2520older%2520AuthMana';" title="Google Bookmarks"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow" id="dotnetkicks" href="javascript:window.location='http%3A%2F%2Fwww.dotnetkicks.com%2Fkick%2F%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F04%252F27%252Fusing-commerce-servers-upmmembershipprovider-with-dotnetnuke%252F%26amp%3Btitle%3DUsing%2520Commerce%2520Server%2527s%2520UpmMembershipProvider%2520with%2520DotNetNuke';" title="DotNetKicks"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/dotnetkicks.png" title="DotNetKicks" alt="DotNetKicks" class="sociable-hovers" /></a>
	<a rel="nofollow" id="linkedin" href="javascript:window.location='http%3A%2F%2Fwww.linkedin.com%2FshareArticle%3Fmini%3Dtrue%26amp%3Burl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F04%252F27%252Fusing-commerce-servers-upmmembershipprovider-with-dotnetnuke%252F%26amp%3Btitle%3DUsing%2520Commerce%2520Server%2527s%2520UpmMembershipProvider%2520with%2520DotNetNuke%26amp%3Bsource%3DFrom%2Bthe%2BDesk%2Bof%2BBrandon%2BHaynes%2BObservations%2Babout%2Bthe%2Bintersection%2Bof%2Btechnology%252C%2Bbusiness%252C%2Band%2Bintellectual%2Bproperty%26amp%3Bsummary%3DFor%2520those%2520that%2520are%2520not%2520familiar%2520with%2520the%2520UpmMembershipProvider%2520membership%2520provider%252C%2520it%2520is%2520a%2520part%2520of%2520Microsoft%2527s%2520Commerce%2520Server%25202007%2520product%252C%2520and%2520is%2520the%2520only%2520provider%2520that%2520offers%2520interoperability%2520with%2520Commerce%2520Server.%25C2%25A0%2520It%2520replaces%2520the%2520older%2520AuthMana';" title="LinkedIn"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/linkedin.png" title="LinkedIn" alt="LinkedIn" class="sociable-hovers" /></a>
	<a rel="nofollow" id="stumbleupon" href="javascript:window.location='http%3A%2F%2Fwww.stumbleupon.com%2Fsubmit%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F04%252F27%252Fusing-commerce-servers-upmmembershipprovider-with-dotnetnuke%252F%26amp%3Btitle%3DUsing%2520Commerce%2520Server%2527s%2520UpmMembershipProvider%2520with%2520DotNetNuke';" title="StumbleUpon"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/stumbleupon.png" title="StumbleUpon" alt="StumbleUpon" class="sociable-hovers" /></a>
	<a rel="nofollow" id="technorati" href="javascript:window.location='http%3A%2F%2Ftechnorati.com%2Ffaves%3Fadd%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F04%252F27%252Fusing-commerce-servers-upmmembershipprovider-with-dotnetnuke%252F';" title="Technorati"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/technorati.png" title="Technorati" alt="Technorati" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://blogs.law.harvard.edu/brandonhaynes/2008/04/27/using-commerce-servers-upmmembershipprovider-with-dotnetnuke/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-sa/3.0/us/</creativeCommons:license>
	</item>
		<item>
		<title>Enabling ASP.NET 2.0 Localization in a DotNetNuke Application</title>
		<link>http://blogs.law.harvard.edu/brandonhaynes/2008/04/08/enabling-aspnet-20-localization-in-a-dotnetnuke-application/</link>
		<comments>http://blogs.law.harvard.edu/brandonhaynes/2008/04/08/enabling-aspnet-20-localization-in-a-dotnetnuke-application/#comments</comments>
		<pubDate>Tue, 08 Apr 2008 19:02:00 +0000</pubDate>
		<dc:creator>Brandon Haynes</dc:creator>
				<category><![CDATA[DotNetNuke (DNN) Content Management System]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[DotNetNuke]]></category>
		<category><![CDATA[Localization]]></category>

		<guid isPermaLink="false">http://everysport.net/GamePlan3/Default.aspx?tabid=489&amp;EntryID=4</guid>
		<description><![CDATA[Editor&#8217;s note: This approach has been obsoleted in favor of the more straightforward, core-friendly&#160;ASP.NET 2.0 Localization approach outlined here.

DotNetNuke provided rich localization support (in the DotNetNuke.Services.Localization namespace) long before&#160;ASP.NET caught up in version 2.0. Indeed, the core DotNetNuke libraries and UI continue to heavily rely upon this custom implementation to this day.
However, after&#160;ASP.NET 2.0 was [...]]]></description>
			<content:encoded><![CDATA[<p><em>Editor&#8217;s note</em>: This approach has been obsoleted in favor of the more straightforward, core-friendly&nbsp;<a href="http://ASP.NET" title="http://ASP. " target="_blank">ASP.NET</a> 2.0 Localization approach outlined <a href="http://blogs.law.harvard.edu/brandonhaynes/2008/10/29/a-second-look-enabling-aspnet-20-localization-in-a-dotnetnuke-application-2/">here</a>.</p>
<hr />
<p>DotNetNuke provided rich localization support (in the DotNetNuke.Services.Localization namespace) long before&nbsp;<a href="http://ASP.NET" title="http://ASP. " target="_blank">ASP.NET</a> caught up in version 2.0. Indeed, the core DotNetNuke libraries and UI continue to heavily rely upon this custom implementation to this day.</p>
<p>However, after&nbsp;<a href="http://ASP.NET" title="http://ASP. " target="_blank">ASP.NET</a> 2.0 was released, there were apparently a number of issues revolving around the new localization, backwards compatibility, and the existing DotNetNuke localization. As a result, the core team chose to disable all&nbsp;<a href="http://ASP.NET" title="http://ASP. " target="_blank">ASP.NET</a> 2.0 localization at the application level and to rely exclusively upon its internal implementation. This is unfortunate, but understandable &#8212; the core team has a lot of audiences, and must balance the act of pleasing them all.</p>
<p>DotNetNuke localization is excellent, and for almost every scenario, I strongly recommend using this API.  However, there do exist some niche circumstances that lend toward using&nbsp;<a href="http://ASP.NET" title="http://ASP. " target="_blank">ASP.NET</a> 2.0 localization.<br />
Fortunately, with a few small changes, it is possible to restore limited&nbsp;<a href="http://ASP.NET" title="http://ASP. " target="_blank">ASP.NET</a> 2.0 functionality to your DotNetNuke installation. Herein I discuss these changes and their system-wide impact.</p>
<p>Before I begin, all the usual warnings apply: back up your data, attempt this only on a development machine, thoroughly test before entering production, et cetera, et cetera. Caveat lector!</p>
<p>With that, let&#8217;s get started.<span id="more-14"></span></p>
<h3>Restore .resx compilation</h3>
<p>DotNetNuke disables&nbsp;<a href="http://ASP.NET" title="http://ASP. " target="_blank">ASP.NET</a> 2.0 localization by explicitly removing .resx and .resources from the set of custom buildProviders. This is accomplished in the web.config as follows:</p>
<p><span class="kwrd">&lt;</span><span class="html">buildProviders</span><span class="kwrd">&gt;</span> <span class="kwrd">&lt;</span><span class="html">remove</span> <span class="attr">extension</span><span class="kwrd">=&#8221;.resx&#8221;</span><span class="kwrd">/&gt;</span> <span class="kwrd">&lt;</span><span class="html">remove</span> <span class="attr">extension</span><span class="kwrd">=&#8221;.resources&#8221;</span><span class="kwrd">/&gt;</span> <span class="kwrd">&lt;/</span><span class="html">buildProviders</span><span class="kwrd">&gt;</span></p>
<p>Perhaps obviously, we&#8217;ll first need to re-enable .resx compilation by deleting “&lt;remove extension=&#8221;.resx&#8221;/&gt;”.</p>
<p>Warning: Because DotNetNuke uses the .resources extension for a number of other purposes (including to prevent IIS from serving sensitive files), I neither recommend enabling this extension, nor have performed ANY testing with regards to files having this extension. I strongly suggest leaving it alone.</p>
<h3>Dealing with Portal-Specific Resources in App_GlobalResources</h3>
<p>Once the .resx extension has been re-enabled,&nbsp;<a href="http://ASP.NET" title="http://ASP. " target="_blank">ASP.NET</a> will begin compiling existing .resx resource files. However, this will cause a problem for those resources that have been localized for a specific portal. DotNetNuke creates these files with a [FileName].Portal-[PortalId].resx format (e.g. “SharedResources.Portal-0.resx”). When the&nbsp;<a href="http://ASP.NET" title="http://ASP. " target="_blank">ASP.NET</a> resource compiler attempts to compile these files, it will generate an error. This is because&nbsp;<a href="http://ASP.NET" title="http://ASP. " target="_blank">ASP.NET</a> expects the “Portal-[PortalId]” token to be a valid language (e.g. en-US). Obviously, “Portal-[PortalId]” is not a valid language, and the resource compiler chokes with: “CS0101: The namespace &#8216;Resources&#8217; already contains a definition for &#8216;SharedResources&#8217;”</p>
<p>If you never expect to localize any of your resources (never!), then you will not encounter this situation, and may skip this step.</p>
<p>Otherwise, we are thus forced to prevent the&nbsp;<a href="http://ASP.NET" title="http://ASP. " target="_blank">ASP.NET</a> resource compiler from compiling these files. Although I am not fully happy with this solution, to date the best method that I have found to accomplish this is to rename the App_GlobalResources directory.</p>
<p>This requires two changes:</p>
<p>1) Rename your App_GlobalResources directory to GlobalResources.</p>
<p>2) Update the DotNetNuke core to look in the new GlobalResources directory. This value is set on or about line 73 of Library/Components/Localization/Localization.vb:</p>
<p><span class="kwrd">Public</span> <span class="kwrd">Const</span> ApplicationResourceDirectory <span class="kwrd">As</span> <span class="kwrd">String</span> = <span class="str">&#8220;~/App_GlobalResources&#8221;</span></p>
<p>Changed to:</p>
<p><span class="kwrd">Public</span> <span class="kwrd">Const</span> ApplicationResourceDirectory <span class="kwrd">As</span> <span class="kwrd">String</span> = <span class="str">&#8220;~/GlobalResources&#8221;</span></p>
<p>I have requested that this value be settable via external configuration so that a core compilation is not required, but this is yet unimplemented.</p>
<h3>Restore resheaders and schema to invalid DotNetNuke resource files.</h3>
<p>&nbsp;<a href="http://ASP.NET" title="http://ASP.<br />
" target="_blank">ASP.NET</a> 2.0 localization requires a valid set of resheaders <span style="text-decoration: line-through">and schema</span> for its resource files. Since DotNetNuke treats .resx files as simple xml files, it does not need this additional information. As a result, some language pack designers have intentionally omitted these data. DotNetNuke itself provides&nbsp;<a href="http://ASP.NET" title="http://ASP. " target="_blank">ASP.NET</a> 2.0 localization-friendly .resx files for the most part, but there are random and frustrating omissions.</p>
<p>You’ll know you’ve encountered one of these problematic .resx files when a page fails with the following exception: DotNetNuke.Services.Exceptions.ModuleLoadException: ResX input is not valid. Cannot find valid &#8220;resheader&#8221; tags for the ResX reader and writer type names. Note that that since&nbsp;<a href="http://ASP.NET" title="http://ASP. " target="_blank">ASP.NET</a> 2.0 compiles all resources in App_LocalResources at once, the problem could be in ANY of the files, <strong>not </strong>just the one being accessed.</p>
<p>Unfortunately, these values must be manually added to those&nbsp;<a href="http://ASP.NET" title="http://ASP. " target="_blank">ASP.NET</a> 2.0-invalid .resx files. Admin/Host/App_LocalResources/Solutions.ascx.resx is a continual culprit. Open with any text editor and paste the following <span style="text-decoration: line-through">schema and</span> resheaders under the element:</p>
<p><span class="kwrd">&lt;</span><span class="html">resheader</span> <span class="attr">name</span><span class="kwrd">=&#8221;resmimetype&#8221;</span><span class="kwrd">&gt;</span> <span class="kwrd">&lt;</span><span class="html">value</span><span class="kwrd">&gt;</span>text/microsoft-resx<span class="kwrd">&lt;/</span><span class="html">value</span><span class="kwrd">&gt;</span> <span class="kwrd">&lt;/</span><span class="html">resheader</span><span class="kwrd">&gt;</span> <span class="kwrd">&lt;</span><span class="html">resheader</span> <span class="attr">name</span><span class="kwrd">=&#8221;version&#8221;</span><span class="kwrd">&gt;</span> <span class="kwrd">&lt;</span><span class="html">value</span><span class="kwrd">&gt;</span>2.0<span class="kwrd">&lt;/</span><span class="html">value</span><span class="kwrd">&gt;</span> <span class="kwrd">&lt;/</span><span class="html">resheader</span><span class="kwrd">&gt;</span> <span class="kwrd">&lt;</span><span class="html">resheader</span> <span class="attr">name</span><span class="kwrd">=&#8221;reader&#8221;</span><span class="kwrd">&gt;</span> <span class="kwrd">&lt;</span><span class="html">value</span><span class="kwrd">&gt;</span>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089<span class="kwrd">&lt;</span><span class="html">value</span><span class="kwrd">&gt;</span> <span class="kwrd">&lt;/</span><span class="html">resheader</span><span class="kwrd">&gt;</span> <span class="kwrd">&lt;</span><span class="html">resheader</span> <span class="attr">name</span><span class="kwrd">=&#8221;writer&#8221;</span><span class="kwrd">&gt;</span> <span class="kwrd">&lt;</span><span class="html">value</span><span class="kwrd">&gt;</span>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089<span class="kwrd">&lt;/</span><span class="html">value</span><span class="kwrd">&gt;</span> <span class="kwrd">&lt;/</span><span class="html">resheader</span><span class="kwrd">&gt;</span></p>
<blockquote><p><span style="color: #800000">Note: After publishing, I discovered that only the resheaders are required; the schema remains optional.  For those that wish to include schema, I will include it as a comment below.</span></p></blockquote>
<p>Once you save the resource file with the expected data, the exception should go away. I have requested that these data be added to all standard DotNetNuke resources files, but the core team has disagreed with me. Charles Nurse indicated that:</p>
<blockquote><p><em>&#8230;We have for historical reasons used the resx language files as standard xml files. This is how they are processed &#8211; in fact the resx file extension is eplicitly disabled from the BuildManager in web.config.</em></p>
<p><em>While the schema is added automatically to the resx files by the resource editor in Visual Studio, it is our intention to remove the headers as they affect performance in our implementation.</em></p>
<p><em>The fact that you have decided to compile those resources in your modules means that your requirements conflict with the core requirements. We cannot address this.</em></p></blockquote>
<p>He has an excellent point, and though my requirements do differ, I completely agree with his conclusion. Read the full details <a href="http://support.dotnetnuke.com/issue/ViewIssue.aspx?id=6383&amp;PROJID=2"><span style="text-decoration: underline"><span style="color: #669966">here</span></span></a>.</p>
<h3>Compile and Enjoy</h3>
<p>These changes will allow you to use&nbsp;<a href="http://ASP.NET" title="http://ASP. " target="_blank">ASP.NET</a> 2.0 localization at the App_LocalResources level – including .ascx syntax (via the &lt;%$ %&gt;or meta:resourcekey methods) and by code (via the strongly-typed Resources object, or by a GetLocalResourceObject call.</p>
<p>GlobalResources should also be accessible, provided a new App_GlobalResources directory is created and resources are placed within. However, the DotNetNuke GlobalResources and SharedResources values will need to be accessed via the DotNetNuke localization API (as they probably should be).</p>
<p>If anyone actually chooses to go this route and implement the changes I’ve outlined above, I’d appreciate feedback and information about any problems encountered. Eventually I’m sure that DotNetNuke will move to support&nbsp;<a href="http://ASP.NET" title="http://ASP. " target="_blank">ASP.NET</a> 2.0 localization, and this is a good step in that direction!</p>
<p>B</p>



Share on:


	<a rel="nofollow" id="digg" href="javascript:window.location='http%3A%2F%2Fdigg.com%2Fsubmit%3Fphase%3D2%26amp%3Burl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F04%252F08%252Fenabling-aspnet-20-localization-in-a-dotnetnuke-application%252F%26amp%3Btitle%3DEnabling%2520ASP.NET%25202.0%2520Localization%2520in%2520a%2520DotNetNuke%2520Application%26amp%3Bbodytext%3DEditor%2527s%2520note%253A%2520This%2520approach%2520has%2520been%2520obsoleted%2520in%2520favor%2520of%2520the%2520more%2520straightforward%252C%2520core-friendly%2520ASP.NET%25202.0%2520Localization%2520approach%2520outlined%2520here.%250D%250A%250D%250A%250D%250A%250D%250ADotNetNuke%2520provided%2520rich%2520localization%2520support%2520%2528in%2520the%2520DotNetNuke.Services.Localization%2520namespa';" title="Digg"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow" id="del.icio.us" href="javascript:window.location='http%3A%2F%2Fdelicious.com%2Fpost%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F04%252F08%252Fenabling-aspnet-20-localization-in-a-dotnetnuke-application%252F%26amp%3Btitle%3DEnabling%2520ASP.NET%25202.0%2520Localization%2520in%2520a%2520DotNetNuke%2520Application%26amp%3Bnotes%3DEditor%2527s%2520note%253A%2520This%2520approach%2520has%2520been%2520obsoleted%2520in%2520favor%2520of%2520the%2520more%2520straightforward%252C%2520core-friendly%2520ASP.NET%25202.0%2520Localization%2520approach%2520outlined%2520here.%250D%250A%250D%250A%250D%250A%250D%250ADotNetNuke%2520provided%2520rich%2520localization%2520support%2520%2528in%2520the%2520DotNetNuke.Services.Localization%2520namespa';" title="del.icio.us"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow" id="facebook" href="javascript:window.location='http%3A%2F%2Fwww.facebook.com%2Fshare.php%3Fu%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F04%252F08%252Fenabling-aspnet-20-localization-in-a-dotnetnuke-application%252F%26amp%3Bt%3DEnabling%2520ASP.NET%25202.0%2520Localization%2520in%2520a%2520DotNetNuke%2520Application';" title="Facebook"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow" id="google" href="javascript:window.location='http%3A%2F%2Fwww.google.com%2Fbookmarks%2Fmark%3Fop%3Dedit%26amp%3Bbkmk%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F04%252F08%252Fenabling-aspnet-20-localization-in-a-dotnetnuke-application%252F%26amp%3Btitle%3DEnabling%2520ASP.NET%25202.0%2520Localization%2520in%2520a%2520DotNetNuke%2520Application%26amp%3Bannotation%3DEditor%2527s%2520note%253A%2520This%2520approach%2520has%2520been%2520obsoleted%2520in%2520favor%2520of%2520the%2520more%2520straightforward%252C%2520core-friendly%2520ASP.NET%25202.0%2520Localization%2520approach%2520outlined%2520here.%250D%250A%250D%250A%250D%250A%250D%250ADotNetNuke%2520provided%2520rich%2520localization%2520support%2520%2528in%2520the%2520DotNetNuke.Services.Localization%2520namespa';" title="Google Bookmarks"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow" id="dotnetkicks" href="javascript:window.location='http%3A%2F%2Fwww.dotnetkicks.com%2Fkick%2F%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F04%252F08%252Fenabling-aspnet-20-localization-in-a-dotnetnuke-application%252F%26amp%3Btitle%3DEnabling%2520ASP.NET%25202.0%2520Localization%2520in%2520a%2520DotNetNuke%2520Application';" title="DotNetKicks"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/dotnetkicks.png" title="DotNetKicks" alt="DotNetKicks" class="sociable-hovers" /></a>
	<a rel="nofollow" id="linkedin" href="javascript:window.location='http%3A%2F%2Fwww.linkedin.com%2FshareArticle%3Fmini%3Dtrue%26amp%3Burl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F04%252F08%252Fenabling-aspnet-20-localization-in-a-dotnetnuke-application%252F%26amp%3Btitle%3DEnabling%2520ASP.NET%25202.0%2520Localization%2520in%2520a%2520DotNetNuke%2520Application%26amp%3Bsource%3DFrom%2Bthe%2BDesk%2Bof%2BBrandon%2BHaynes%2BObservations%2Babout%2Bthe%2Bintersection%2Bof%2Btechnology%252C%2Bbusiness%252C%2Band%2Bintellectual%2Bproperty%26amp%3Bsummary%3DEditor%2527s%2520note%253A%2520This%2520approach%2520has%2520been%2520obsoleted%2520in%2520favor%2520of%2520the%2520more%2520straightforward%252C%2520core-friendly%2520ASP.NET%25202.0%2520Localization%2520approach%2520outlined%2520here.%250D%250A%250D%250A%250D%250A%250D%250ADotNetNuke%2520provided%2520rich%2520localization%2520support%2520%2528in%2520the%2520DotNetNuke.Services.Localization%2520namespa';" title="LinkedIn"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/linkedin.png" title="LinkedIn" alt="LinkedIn" class="sociable-hovers" /></a>
	<a rel="nofollow" id="stumbleupon" href="javascript:window.location='http%3A%2F%2Fwww.stumbleupon.com%2Fsubmit%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F04%252F08%252Fenabling-aspnet-20-localization-in-a-dotnetnuke-application%252F%26amp%3Btitle%3DEnabling%2520ASP.NET%25202.0%2520Localization%2520in%2520a%2520DotNetNuke%2520Application';" title="StumbleUpon"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/stumbleupon.png" title="StumbleUpon" alt="StumbleUpon" class="sociable-hovers" /></a>
	<a rel="nofollow" id="technorati" href="javascript:window.location='http%3A%2F%2Ftechnorati.com%2Ffaves%3Fadd%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F04%252F08%252Fenabling-aspnet-20-localization-in-a-dotnetnuke-application%252F';" title="Technorati"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/technorati.png" title="Technorati" alt="Technorati" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://blogs.law.harvard.edu/brandonhaynes/2008/04/08/enabling-aspnet-20-localization-in-a-dotnetnuke-application/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-sa/3.0/us/</creativeCommons:license>
	</item>
		<item>
		<title>Issues and Solutions with Microsoft Dynamics CRM 4.0 Installation</title>
		<link>http://blogs.law.harvard.edu/brandonhaynes/2008/03/03/issues-and-solutions-with-microsoft-dynamics-crm-40-installation/</link>
		<comments>http://blogs.law.harvard.edu/brandonhaynes/2008/03/03/issues-and-solutions-with-microsoft-dynamics-crm-40-installation/#comments</comments>
		<pubDate>Mon, 03 Mar 2008 20:59:00 +0000</pubDate>
		<dc:creator>Brandon Haynes</dc:creator>
				<category><![CDATA[Microsoft Customer Relationship Management (CRM)]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[CRM]]></category>
		<category><![CDATA[MSCRM]]></category>

		<guid isPermaLink="false">http://everysport.net/GamePlan3/Default.aspx?tabid=489&amp;EntryID=3</guid>
		<description><![CDATA[In installing Microsoft Dynamics CRM 4.0, I ran across a couple of installation issues. These were mostly circumventable, but I thought I&#8217;d aggregate them here in case anyone out there has similar problems:

The installer created a CRM website, but failed to configure it as an application. I have a very specific server configuration, so this [...]]]></description>
			<content:encoded><![CDATA[<p>In installing Microsoft Dynamics CRM 4.0, I ran across a couple of installation issues. These were mostly circumventable, but I thought I&#8217;d aggregate them here in case anyone out there has similar problems:</p>
<ol>
<li>The installer created a CRM website, but failed to configure it as an application. I have a very specific server configuration, so this may have caused the problem. Nonetheless, I had to visit IIS and configure my CRM website as its own application and enable Windows Authentication. I believe it was also necessary to configure default.aspx as a default document as well.</li>
<li>It was a requirement that the system be exposed via a single SSL port, and this caused some headaches. Obviously, I had to configure the SSL port in IIS. Because this port was different than the non-SSL port configured at installation, there were some registry and database changes required. Specifically:
<ol>
<li>Under HKLM\Software\Microsoft\MSCRM, the ServerUrl key needs to be updated.</li>
<li>In the DeploymentProperties table of the MSCRM_CONFIG database, the rows with ColumnName in {&#8217;AsyncSdkRootDomain&#8217;, &#8216;ADSdkRootDomain&#8217;, &#8216;ADWebApplicationRootDomain&#8217;, and &#8216;ADRootDomainScheme&#8217;} need to be updated. The column to update is NVarCharColumn. Value is of the format &#8217;server:port&#8217; (e.g.; &#8216;microsoft.com:5556&#8242;). If running under SSL, you&#8217;ll need to update the last key, ADRootDomainScheme, to &#8216;https&#8217; (also using the NVarCharColumn column).</li>
</ol>
</li>
<li>Once I had executed the above changes, the client tool still complained about being able to connect to the server. Using Fiddler, I was able to determine that there was an authentication problem. Modifying the registry keys under HKCU\Software\Microsoft\MSCRMClient did the trick. Apparently the organization was appended to the web application directories, which resulted in a 404 upon connection. I modified WebAppUrl and IntranetServerUrl, but I recommend reviewing all the keys.</li>
<li>Apparently the client requires anonymous access to be enabled on the _imgs subdirectory of the CRM installation. This corrected my final authentication issue. Thanks to the poster <a href="http://groups.google.com/group/microsoft.public.crm/browse_thread/thread/0a2d4cd0336b3f68/874ec885a7e0e59c">here</a> for this solution.</li>
<li>Finally, after the client installed and connected properly, I received an error when loading outlook which read &#8220;An error occurred loading Microsoft Dynamics CRM functionality.&#8221; This was apparently due to a conflict between an old 3.0 installation and the 4.0 software. 3.0 failed to fully clean up after itself. Manually removing the duplicate CRM menu did the trick; I used View-&gt;Toolbars-&gt;Customize, right clicked on the depreciated 3.0 menu, and selected Delete. Restarted Outlook and I was up and running.</li>
</ol>
<p>That&#8217;s a lot of work to get things up and running, but FAR less of a hassle than I experienced in tinkering with the 3.0 version.</p>
<p>B</p>



Share on:


	<a rel="nofollow" id="digg" href="javascript:window.location='http%3A%2F%2Fdigg.com%2Fsubmit%3Fphase%3D2%26amp%3Burl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F03%252F03%252Fissues-and-solutions-with-microsoft-dynamics-crm-40-installation%252F%26amp%3Btitle%3DIssues%2520and%2520Solutions%2520with%2520Microsoft%2520Dynamics%2520CRM%25204.0%2520Installation%26amp%3Bbodytext%3DIn%2520installing%2520Microsoft%2520Dynamics%2520CRM%25204.0%252C%2520I%2520ran%2520across%2520a%2520couple%2520of%2520installation%2520issues.%2520These%2520were%2520mostly%2520circumventable%252C%2520but%2520I%2520thought%2520I%2527d%2520aggregate%2520them%2520here%2520in%2520case%2520anyone%2520out%2520there%2520has%2520similar%2520problems%253A%250D%250A%250D%250A%2509The%2520installer%2520created%2520a%2520CRM%2520website%252C%2520bu';" title="Digg"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow" id="del.icio.us" href="javascript:window.location='http%3A%2F%2Fdelicious.com%2Fpost%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F03%252F03%252Fissues-and-solutions-with-microsoft-dynamics-crm-40-installation%252F%26amp%3Btitle%3DIssues%2520and%2520Solutions%2520with%2520Microsoft%2520Dynamics%2520CRM%25204.0%2520Installation%26amp%3Bnotes%3DIn%2520installing%2520Microsoft%2520Dynamics%2520CRM%25204.0%252C%2520I%2520ran%2520across%2520a%2520couple%2520of%2520installation%2520issues.%2520These%2520were%2520mostly%2520circumventable%252C%2520but%2520I%2520thought%2520I%2527d%2520aggregate%2520them%2520here%2520in%2520case%2520anyone%2520out%2520there%2520has%2520similar%2520problems%253A%250D%250A%250D%250A%2509The%2520installer%2520created%2520a%2520CRM%2520website%252C%2520bu';" title="del.icio.us"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow" id="facebook" href="javascript:window.location='http%3A%2F%2Fwww.facebook.com%2Fshare.php%3Fu%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F03%252F03%252Fissues-and-solutions-with-microsoft-dynamics-crm-40-installation%252F%26amp%3Bt%3DIssues%2520and%2520Solutions%2520with%2520Microsoft%2520Dynamics%2520CRM%25204.0%2520Installation';" title="Facebook"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow" id="google" href="javascript:window.location='http%3A%2F%2Fwww.google.com%2Fbookmarks%2Fmark%3Fop%3Dedit%26amp%3Bbkmk%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F03%252F03%252Fissues-and-solutions-with-microsoft-dynamics-crm-40-installation%252F%26amp%3Btitle%3DIssues%2520and%2520Solutions%2520with%2520Microsoft%2520Dynamics%2520CRM%25204.0%2520Installation%26amp%3Bannotation%3DIn%2520installing%2520Microsoft%2520Dynamics%2520CRM%25204.0%252C%2520I%2520ran%2520across%2520a%2520couple%2520of%2520installation%2520issues.%2520These%2520were%2520mostly%2520circumventable%252C%2520but%2520I%2520thought%2520I%2527d%2520aggregate%2520them%2520here%2520in%2520case%2520anyone%2520out%2520there%2520has%2520similar%2520problems%253A%250D%250A%250D%250A%2509The%2520installer%2520created%2520a%2520CRM%2520website%252C%2520bu';" title="Google Bookmarks"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow" id="dotnetkicks" href="javascript:window.location='http%3A%2F%2Fwww.dotnetkicks.com%2Fkick%2F%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F03%252F03%252Fissues-and-solutions-with-microsoft-dynamics-crm-40-installation%252F%26amp%3Btitle%3DIssues%2520and%2520Solutions%2520with%2520Microsoft%2520Dynamics%2520CRM%25204.0%2520Installation';" title="DotNetKicks"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/dotnetkicks.png" title="DotNetKicks" alt="DotNetKicks" class="sociable-hovers" /></a>
	<img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/linkedin.png" title="LinkedIn" alt="LinkedIn" class="sociable-hovers" /></a>
	<a rel="nofollow" id="stumbleupon" href="javascript:window.location='http%3A%2F%2Fwww.stumbleupon.com%2Fsubmit%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F03%252F03%252Fissues-and-solutions-with-microsoft-dynamics-crm-40-installation%252F%26amp%3Btitle%3DIssues%2520and%2520Solutions%2520with%2520Microsoft%2520Dynamics%2520CRM%25204.0%2520Installation';" title="StumbleUpon"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/stumbleupon.png" title="StumbleUpon" alt="StumbleUpon" class="sociable-hovers" /></a>
	<a rel="nofollow" id="technorati" href="javascript:window.location='http%3A%2F%2Ftechnorati.com%2Ffaves%3Fadd%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F03%252F03%252Fissues-and-solutions-with-microsoft-dynamics-crm-40-installation%252F';" title="Technorati"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/technorati.png" title="Technorati" alt="Technorati" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://blogs.law.harvard.edu/brandonhaynes/2008/03/03/issues-and-solutions-with-microsoft-dynamics-crm-40-installation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-sa/3.0/us/</creativeCommons:license>
	</item>
		<item>
		<title>Configuring custom INavigationService in WCSF library</title>
		<link>http://blogs.law.harvard.edu/brandonhaynes/2008/02/17/configuring-custom-inavigationservice-in-wcsf-library/</link>
		<comments>http://blogs.law.harvard.edu/brandonhaynes/2008/02/17/configuring-custom-inavigationservice-in-wcsf-library/#comments</comments>
		<pubDate>Sun, 17 Feb 2008 18:17:00 +0000</pubDate>
		<dc:creator>Brandon Haynes</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[Web Client Software Factory (WCSF)]]></category>
		<category><![CDATA[INavigationService]]></category>
		<category><![CDATA[WCSF]]></category>

		<guid isPermaLink="false">http://everysport.net/GamePlan3/Default.aspx?tabid=489&amp;EntryID=2</guid>
		<description><![CDATA[I was dismayed to discover that one could not configure a custom INavigationService at the web.config level.  As part of my experiments to integrate PageFlow into a DotNetNuke module, I needed such customization, and wanted to continue to configure the providers in the web.config.
So, instead of kludging and compiling my own custom PageFlow libraries, I decided [...]]]></description>
			<content:encoded><![CDATA[<p>I was <a href="http://www.codeplex.com/websf/Thread/View.aspx?ThreadId=13863">dismayed to discover</a> that one could not configure a custom INavigationService at the web.config level.  As part of my experiments to integrate PageFlow into a DotNetNuke module, I needed such customization, and wanted to continue to configure the providers in the web.config.</p>
<p>So, instead of kludging and compiling my own custom PageFlow libraries, I decided to modify the framework itself and allow customization of the INavigationService at the web.config level.  Required only a small number of code changes, and ultimately the navigation service interface is configured as:</p>
<p>I created a work item in the WSCF project which discusses my changes in a little more detail.  It essentially boiled down to adding a new string attribute (NavigationType) to the provider section class (defaulting to the existing Microsoft.Practices.PageFlow.Services.NavigationService), modifying the BuildProvider method to use this configuration value, and adding the extra parameter to the provider constructor.</p>
<p>Work item is located <a href="http://www.codeplex.com/websf/WorkItem/View.aspx?WorkItemId=15208">here</a>.<br />
Patch is located <a href="http://www.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=websf&amp;DownloadId=27695">here.</a></p>
<p>Hope this helps anyone who needs a custom navigation service for the PageFlow block in the WCSF.  I&#8217;ll be continuing to blog about my attempts to integrate this block into a DNN module and  have it play nicely with the DNN framework.</p>
<p>B</p>



Share on:


	<a rel="nofollow" id="digg" href="javascript:window.location='http%3A%2F%2Fdigg.com%2Fsubmit%3Fphase%3D2%26amp%3Burl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F02%252F17%252Fconfiguring-custom-inavigationservice-in-wcsf-library%252F%26amp%3Btitle%3DConfiguring%2520custom%2520INavigationService%2520in%2520WCSF%2520library%26amp%3Bbodytext%3DI%2520was%2520dismayed%2520to%2520discover%25C2%25A0that%2520one%2520could%2520not%2520configure%2520a%2520custom%2520INavigationService%2520at%2520the%2520web.config%2520level.%25C2%25A0%2520As%2520part%2520of%2520my%2520experiments%2520to%2520integrate%2520PageFlow%2520into%2520a%2520DotNetNuke%2520module%252C%2520I%2520needed%2520such%2520customization%252C%2520and%2520wanted%2520to%2520continue%2520to%2520configure';" title="Digg"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow" id="del.icio.us" href="javascript:window.location='http%3A%2F%2Fdelicious.com%2Fpost%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F02%252F17%252Fconfiguring-custom-inavigationservice-in-wcsf-library%252F%26amp%3Btitle%3DConfiguring%2520custom%2520INavigationService%2520in%2520WCSF%2520library%26amp%3Bnotes%3DI%2520was%2520dismayed%2520to%2520discover%25C2%25A0that%2520one%2520could%2520not%2520configure%2520a%2520custom%2520INavigationService%2520at%2520the%2520web.config%2520level.%25C2%25A0%2520As%2520part%2520of%2520my%2520experiments%2520to%2520integrate%2520PageFlow%2520into%2520a%2520DotNetNuke%2520module%252C%2520I%2520needed%2520such%2520customization%252C%2520and%2520wanted%2520to%2520continue%2520to%2520configure';" title="del.icio.us"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow" id="facebook" href="javascript:window.location='http%3A%2F%2Fwww.facebook.com%2Fshare.php%3Fu%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F02%252F17%252Fconfiguring-custom-inavigationservice-in-wcsf-library%252F%26amp%3Bt%3DConfiguring%2520custom%2520INavigationService%2520in%2520WCSF%2520library';" title="Facebook"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow" id="google" href="javascript:window.location='http%3A%2F%2Fwww.google.com%2Fbookmarks%2Fmark%3Fop%3Dedit%26amp%3Bbkmk%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F02%252F17%252Fconfiguring-custom-inavigationservice-in-wcsf-library%252F%26amp%3Btitle%3DConfiguring%2520custom%2520INavigationService%2520in%2520WCSF%2520library%26amp%3Bannotation%3DI%2520was%2520dismayed%2520to%2520discover%25C2%25A0that%2520one%2520could%2520not%2520configure%2520a%2520custom%2520INavigationService%2520at%2520the%2520web.config%2520level.%25C2%25A0%2520As%2520part%2520of%2520my%2520experiments%2520to%2520integrate%2520PageFlow%2520into%2520a%2520DotNetNuke%2520module%252C%2520I%2520needed%2520such%2520customization%252C%2520and%2520wanted%2520to%2520continue%2520to%2520configure';" title="Google Bookmarks"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow" id="dotnetkicks" href="javascript:window.location='http%3A%2F%2Fwww.dotnetkicks.com%2Fkick%2F%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F02%252F17%252Fconfiguring-custom-inavigationservice-in-wcsf-library%252F%26amp%3Btitle%3DConfiguring%2520custom%2520INavigationService%2520in%2520WCSF%2520library';" title="DotNetKicks"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/dotnetkicks.png" title="DotNetKicks" alt="DotNetKicks" class="sociable-hovers" /></a>
	<a rel="nofollow" id="linkedin" href="javascript:window.location='http%3A%2F%2Fwww.linkedin.com%2FshareArticle%3Fmini%3Dtrue%26amp%3Burl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F02%252F17%252Fconfiguring-custom-inavigationservice-in-wcsf-library%252F%26amp%3Btitle%3DConfiguring%2520custom%2520INavigationService%2520in%2520WCSF%2520library%26amp%3Bsource%3DFrom%2Bthe%2BDesk%2Bof%2BBrandon%2BHaynes%2BObservations%2Babout%2Bthe%2Bintersection%2Bof%2Btechnology%252C%2Bbusiness%252C%2Band%2Bintellectual%2Bproperty%26amp%3Bsummary%3DI%2520was%2520dismayed%2520to%2520discover%25C2%25A0that%2520one%2520could%2520not%2520configure%2520a%2520custom%2520INavigationService%2520at%2520the%2520web.config%2520level.%25C2%25A0%2520As%2520part%2520of%2520my%2520experiments%2520to%2520integrate%2520PageFlow%2520into%2520a%2520DotNetNuke%2520module%252C%2520I%2520needed%2520such%2520customization%252C%2520and%2520wanted%2520to%2520continue%2520to%2520configure';" title="LinkedIn"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/linkedin.png" title="LinkedIn" alt="LinkedIn" class="sociable-hovers" /></a>
	<a rel="nofollow" id="stumbleupon" href="javascript:window.location='http%3A%2F%2Fwww.stumbleupon.com%2Fsubmit%3Furl%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F02%252F17%252Fconfiguring-custom-inavigationservice-in-wcsf-library%252F%26amp%3Btitle%3DConfiguring%2520custom%2520INavigationService%2520in%2520WCSF%2520library';" title="StumbleUpon"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/stumbleupon.png" title="StumbleUpon" alt="StumbleUpon" class="sociable-hovers" /></a>
	<a rel="nofollow" id="technorati" href="javascript:window.location='http%3A%2F%2Ftechnorati.com%2Ffaves%3Fadd%3Dhttp%253A%252F%252Fblogs.law.harvard.edu%252Fbrandonhaynes%252F2008%252F02%252F17%252Fconfiguring-custom-inavigationservice-in-wcsf-library%252F';" title="Technorati"><img src="http://blogs.law.harvard.edu/brandonhaynes/wp-content/plugins/sociable/images/technorati.png" title="Technorati" alt="Technorati" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://blogs.law.harvard.edu/brandonhaynes/2008/02/17/configuring-custom-inavigationservice-in-wcsf-library/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-sa/3.0/us/</creativeCommons:license>
	</item>
	</channel>
</rss>
