<?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:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Peter Sterpe&#039;s Blog</title>
	<atom:link href="http://psterpe.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://psterpe.wordpress.com</link>
	<description>Applying technology to business problems is my idea of fun</description>
	<lastBuildDate>Sat, 07 May 2011 20:35:04 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='psterpe.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://1.gravatar.com/blavatar/19479443412b5976fb561c640ddf3209?s=96&#038;d=http%3A%2F%2Fs2.wp.com%2Fi%2Fbuttonw-com.png</url>
		<title>Peter Sterpe&#039;s Blog</title>
		<link>http://psterpe.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://psterpe.wordpress.com/osd.xml" title="Peter Sterpe&#039;s Blog" />
	<atom:link rel='hub' href='http://psterpe.wordpress.com/?pushpress=hub'/>
		<item>
		<title>When art comes from people who aren&#8217;t &#8220;artists&#8221;</title>
		<link>http://psterpe.wordpress.com/2010/06/01/when-art-comes-from-people-who-arent-artists/</link>
		<comments>http://psterpe.wordpress.com/2010/06/01/when-art-comes-from-people-who-arent-artists/#comments</comments>
		<pubDate>Tue, 01 Jun 2010 14:20:27 +0000</pubDate>
		<dc:creator>psterpe</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://psterpe.wordpress.com/?p=173</guid>
		<description><![CDATA[John Quarello, the brother of a good friend, has a blog on which he displays and discusses sketches, paintings, and sculptures he has created. I love his work, and I&#8217;m always amazed when people who are not professional artists and who don&#8217;t have formal art training can manage to create &#8230; art! I&#8217;m mystified by [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=psterpe.wordpress.com&amp;blog=6846254&amp;post=173&amp;subd=psterpe&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>John Quarello, the brother of a good friend, has a blog on which he displays and discusses sketches, paintings, and sculptures he has created. I love his work, and I&#8217;m always amazed when people who are not professional artists and who don&#8217;t have formal art training can manage to create &#8230; art! I&#8217;m mystified by even the simplest drawing exercise, and forget about handing me &#8220;media&#8221; to work with.</p>
<p>John&#8217;s blog is at http://impressionistictransition.blogspot.com/</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/psterpe.wordpress.com/173/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/psterpe.wordpress.com/173/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/psterpe.wordpress.com/173/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/psterpe.wordpress.com/173/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/psterpe.wordpress.com/173/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/psterpe.wordpress.com/173/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/psterpe.wordpress.com/173/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/psterpe.wordpress.com/173/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/psterpe.wordpress.com/173/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/psterpe.wordpress.com/173/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/psterpe.wordpress.com/173/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/psterpe.wordpress.com/173/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/psterpe.wordpress.com/173/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/psterpe.wordpress.com/173/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=psterpe.wordpress.com&amp;blog=6846254&amp;post=173&amp;subd=psterpe&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://psterpe.wordpress.com/2010/06/01/when-art-comes-from-people-who-arent-artists/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/045720d31ca7bbf213c0496f576ff9a3?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">psterpe</media:title>
		</media:content>
	</item>
		<item>
		<title>Thoughts on an Active Community of Practice Engine</title>
		<link>http://psterpe.wordpress.com/2009/07/27/thoughts-on-an-active-community-of-practice-engine/</link>
		<comments>http://psterpe.wordpress.com/2009/07/27/thoughts-on-an-active-community-of-practice-engine/#comments</comments>
		<pubDate>Tue, 28 Jul 2009 03:09:02 +0000</pubDate>
		<dc:creator>psterpe</dc:creator>
				<category><![CDATA[knowledge management]]></category>
		<category><![CDATA[community of practice]]></category>
		<category><![CDATA[knowledge base]]></category>
		<category><![CDATA[software agent]]></category>

		<guid isPermaLink="false">http://psterpe.wordpress.com/?p=156</guid>
		<description><![CDATA[In my last post on how organizations should look at employee knowledge, I suggested that we need new kinds of tools &#8212; other than word processors &#8212; for helping people contribute to the organizational knowledge base. I didn&#8217;t say how I thought such tools could work, so in this post, I&#8217;m making some suggestions. The [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=psterpe.wordpress.com&amp;blog=6846254&amp;post=156&amp;subd=psterpe&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>In my last <a href="http://psterpe.wordpress.com/2009/07/24/dont-mine-knowledge-cultivate-it/">post on how organizations should look at employee knowledge</a>, I suggested that we need new kinds of tools &#8212; other than word processors &#8212; for helping people contribute to the organizational knowledge base. I didn&#8217;t say how I thought such tools could work, so in this post, I&#8217;m making some suggestions. The lens through which I look at the corporate knowledge base is that of a community of practice. To me, the knowledge base isn&#8217;t the goal; it&#8217;s a side effect of helping would-be collaborators find each other and interact. Let people query each other, help each other, teach each other, lecture each other, cite each other, rewrite each other &#8212; collaborations take many forms &#8212; and give them an online home in which to do it, and you&#8217;ll have laid the foundation for the organization&#8217;s knowledge repository.</p>
<p>When I say &#8220;community of practice,&#8221; I&#8217;m thinking of any set of people who wish to collaborate, seek advice, “compare notes,” and stay abreast of relevant events or knowledge in their field because they do the same job or have the same expertise. Members of a community of practice (COP):</p>
<ul>
<li>May be colleagues, but are not necessarily
<li>May be geographically close, but need not be
<li>May know most other members, but often don’t
<li>May know others who should be members, but often haven’t discovered those people yet
<li>Want to interact and collaborate, but don’t necessarily know how best to do this
<li>May have an online “home” in which to operate, but often don’t
</ul>
<p>I take it as a given that organizations benefit by allowing COPs to form, operate, record their knowledge, and thrive. Without meaning to make any political commentary, I can certainly imagine organizational structures and philosophies that would find all this fraternization dangerous. I probably can&#8217;t convince those folks of my point of view. My target is people who see that communities of practice develop new knowledge and facilitate knowledge transfer within the organization; that COP knowledge can foster innovation and can identify specialties the organization didn’t know it had; and that COP members derive a sense of belonging to the smaller group which transfers to a sense of loyalty to the larger organization.</p>
<p>So why am I convinced we need new tools for COP practitioners? It&#8217;s because the usual suspects let us down. We give people a mailing list, a shared drive for posting files, and maybe a way to conduct online discussions, and then we wait for the magic to happen. &gt;&gt;Crickets chirping&#8230;.&lt;&lt; Well, why doesn&#8217;t the magic happen? Why don&#8217;t online communities just &#8220;work?&#8221;  At first, sometimes they <i>do</i> work if a few motivated and communicative members keep the community alive with questions and content. But the mavens don’t necessarily know valuable ways to encourage participation and attract new blood. Tired of the lukewarm community response to their efforts, the mavens move on or fade into a passive role.</p>
<p>Online communities are still new to us. At least we act as if they are. We don&#8217;t inherently know how to operate them. Lacking a model for success, online COPs usually fizzle. Technology can help solve this problem, but not the static kind of technology that just sits there and waits for people to use it. What we need is an <b><i>active engine</i></b> that drives and guides participation.</p>
<p>What if a community of practice operated on a software platform that &#8220;knew&#8221; what to do? What if the platform:</p>
<ul>
<li>Coached members on how to play the necessary roles to keep the COP vibrant?
<li>Solicited participation from members?
<li>Suggested actions for keeping the community going and the content fresh?
<li>Provided tools and instructions for carrying out its suggestions?
</ul>
<p>To make this just a little less abstract, here are some things I think an active COP engine could do:</p>
<ul>
<li>Maintain a list of key activities that someone in the community should perform, e.g.:
<ul>
<li>Ask a question
<li>Contribute a document or a link to content
<li>Run a survey
<li>Organize an event
<li>Launch a discussion topic
<li>Run a conference call or meeting
<li>Comment on existing content
<li>Propose a new content area
</ul>
<li>Remind practitioners periodically to perform a key activity that has not been done in a while
<li>Seek participation from members, e.g., postings to discussions, answers to questions, comments on content, etc.
<li>Seek missing metadata, e.g., questions need answers, meetings need agendas and minutes, discussion topics need resolutions, etc.
<li>Seek fresh content in weak or stale areas
</ul>
<p>The active COP engine itself would probably be executable code running on the same server as whatever collaboration platform was in use. There&#8217;s no reason to write a new collaboration platform; many exist that provide decent functions and can be extended. The COP engine could use the same underlying database as the collaboration platform for its metadata and any other data it needed to store. It could also use the local messaging capability, e.g., email server, for communicating its guidance and reminders out to the user community. The following figure, in addition to illustrating why I got poor grades in art class, also diagrams a (very) high level hypothetical architecture.<br />
<a href="http://psterpe.files.wordpress.com/2009/07/communityofpracticearchitecture.png"><img src="http://psterpe.files.wordpress.com/2009/07/communityofpracticearchitecture.png?w=720&#038;h=540" alt="CommunityOfPracticeArchitecture" title="CommunityOfPracticeArchitecture" width="720" height="540" class="aligncenter size-full wp-image-155" /></a></p>
<p>Ideally, the engine&#8217;s behavior would be largely data-driven, or said less geekily, a configuration file would tell the engine what to do. For example, you could configure the engine to know that a given activity (&#8220;Run a survey&#8221;) should be carried out by a particular role (perhaps any user could run one, or maybe you&#8217;d decide that only administrators should be able to run surveys) with a given frequency (monthly). You could also specify a set of tools to give the user as aids in carrying out the activity; the tools could be native platform capabilities (e.g., many collaboration platforms have a native capability to launch a discussion) or specially written wizards to supply capabilities and guidance that the platform lacks.</p>
<p>I admit I leave a lot to the imagination, but this is a blog post, not a functional spec or technical design. I&#8217;m not proposing anything technically difficult or groundbreaking here &#8212; agents that &#8220;do stuff&#8221; are not even close to a new idea. And of course you&#8217;d have to devise ways to keep the engine from being an obtrusive pain in the neck or a disrespected amusement (remember the smiling paper clip in Word?) The potential flies in the ointment are addressable without needing any breakthroughs in the field of computer science, though. Worth some consideration, IMHO, are three ideas. First, the idea that communities of practice need guidance and an operating model in order to succeed. Second, the idea that software agents can supply this guidance as an overlay to an existing collaboration platform. And third, the idea that you needn&#8217;t work so hard at <i>building</i> the corporate knowledge base; thriving communities of practice will leave one behind as an artifact of their activities.</p>
<p>I&#8217;m champing at the bit to build this. Anyone have funding?</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/psterpe.wordpress.com/156/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/psterpe.wordpress.com/156/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/psterpe.wordpress.com/156/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/psterpe.wordpress.com/156/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/psterpe.wordpress.com/156/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/psterpe.wordpress.com/156/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/psterpe.wordpress.com/156/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/psterpe.wordpress.com/156/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/psterpe.wordpress.com/156/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/psterpe.wordpress.com/156/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/psterpe.wordpress.com/156/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/psterpe.wordpress.com/156/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/psterpe.wordpress.com/156/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/psterpe.wordpress.com/156/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=psterpe.wordpress.com&amp;blog=6846254&amp;post=156&amp;subd=psterpe&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://psterpe.wordpress.com/2009/07/27/thoughts-on-an-active-community-of-practice-engine/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/045720d31ca7bbf213c0496f576ff9a3?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">psterpe</media:title>
		</media:content>

		<media:content url="http://psterpe.files.wordpress.com/2009/07/communityofpracticearchitecture.png" medium="image">
			<media:title type="html">CommunityOfPracticeArchitecture</media:title>
		</media:content>
	</item>
		<item>
		<title>Don&#8217;t Mine Knowledge, Cultivate It</title>
		<link>http://psterpe.wordpress.com/2009/07/24/dont-mine-knowledge-cultivate-it/</link>
		<comments>http://psterpe.wordpress.com/2009/07/24/dont-mine-knowledge-cultivate-it/#comments</comments>
		<pubDate>Fri, 24 Jul 2009 20:52:20 +0000</pubDate>
		<dc:creator>psterpe</dc:creator>
				<category><![CDATA[knowledge management]]></category>
		<category><![CDATA[knowledge base]]></category>

		<guid isPermaLink="false">http://psterpe.wordpress.com/?p=151</guid>
		<description><![CDATA[Departure today from the technical how-to topics I have been blogging on. This time I&#8217;m waxing poetic on why I think organizations that depend on &#8220;knowledge work&#8221; have the wrong attitude and approach toward knowledge. I&#8217;m moved to write about this by a recent professional experience that struck a chord from my consulting past during [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=psterpe.wordpress.com&amp;blog=6846254&amp;post=151&amp;subd=psterpe&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Departure today from the technical how-to topics I have been blogging on. This time I&#8217;m waxing poetic on why I think organizations that depend on &#8220;knowledge work&#8221; have the wrong attitude and approach toward knowledge. I&#8217;m moved to write about this by a recent professional experience that struck a chord from my consulting past during which &#8220;knowledge management&#8221; was something you could say without apologizing (well, in certain crowds, anyway). Regardless of the heading you put this under and how buzzword compliant that heading is, the basic situation is the same for most of us knowledge workers:</p>
<ul>
<li>Our success depends upon what we know and what we can learn that others know
<li>Our employers/clients expect us to have a lot of this knowledge stuff already, but they also expect us to have clever (and inexpensive) ways of getting more of it
<li>Nobody has the faintest clue what knowledge really is and how to get more of it.
</ul>
<p>OK, the gauntlet is down. I make this claim because in the 25 years that I have been working in and around software products and systems that help people do their jobs better, I haven&#8217;t seen anyone &#8212; except knowledge management consultants &#8212; pay attention to this valuable asset called knowledge. Pretty much everyone is all over the idea of <i>information,</i> which they think is a synonym for knowledge. But I don&#8217;t think people really get the knowledge thing.</p>
<p>What separates knowledge from information is so basic it feels silly to write it down &#8212; knowledge is what people &#8212; breathing humans &#8212; <b>know</b>. I realize that was a tautology; let me try to get out of that doghouse. What makes something knowledge is your experiences and the way you have connected these to the facts and figures you understand. The facts and figures are not knowledge &#8212; they&#8217;re just information. Data. You combine that data with your experiences to produce a bit of knowledge. Here&#8217;s an example that Bostonians will appreciate given that June in Boston this year was so wet, cool, and murky it was how you imagine the forests to be when you read a Tolkien novel. Anyhow, if I have the info that it&#8217;s the middle of June in Boston and this morning it&#8217;s cold enough for me to wear a fleece pullover, I have a good hunch it&#8217;ll rain today. I don&#8217;t have the information on the future of my local weather, I have the knowledge that if you get nasty cold in Boston in June, that&#8217;s not customary &#8212; something is happening, and from my experience, that something is likely to be rain. I <i>know</i> to carry an umbrella or wear a hat.</p>
<p>So who cares whether knowledge and information are the same or different? Did you ever fly in a plane? If so, you should care about the difference. What every dial and lever in that cockpit means and what it controls is nothing more than a large body of information. If I were armed with that information (the manuals are carried on every airplane), would you feel comfortable letting me fly that plane? Didn&#8217;t think so. Even if I had a week to read all the manuals first? Um&#8230;nope. And why not? Because flying a plane depends on so much more than the assembled facts and figures of how a plane operates. OK, so why should an insurance business or a telecommunications carrier or a retail chain care about knowledge? They send a lot of their people to training &#8212; doesn&#8217;t this give the employees what they need to <i>know</i> to do their jobs?</p>
<p>Only a little &#8212; and only temporarily. Training classes have a notoriously low rate of retention (ask any instructional design maven), AND, a lot of class content is information, not knowledge. People get more training on how to work the customer service computer program (&#8220;hit F5 after you enter the phone number&#8221;) than they do on how to provide good customer service (&#8220;let an angry caller tell his story before interrupting to ask the phone number&#8221;). To do most &#8220;knowledge worker&#8221; jobs well takes more than classroom learning. You need enough experience to have seen some of the exceptional cases; you need to develop some intuition about what will happen based on your decisions and actions. This is what makes the hot shots hot; what they know goes beyond the mechanics of the ordinary. Experts can operate in the realm of what <i>will</i> happen or what <i>should</i> be the case or what <i>mustn&#8217;t</i> be done. And doesn&#8217;t every knowledge intensive business want as many employees as possible to perform like experts?</p>
<p>This knowledge stuff is valuable &#8212; in more extreme cases, it can keep people alive, and in ordinary cases, it can help you acquire customers and retain them; lack of it can certainly help you lose them. So why don&#8217;t businesses approach knowledge the right way? Some confuse knowledge with information, and those businesses think they <b>are</b> doing the right thing. They run training and they cram binders with factoids (and you can even take the course materials away on a USB memory stick!). Other businesses see that, despite the need to impart information to their workers, this alone won&#8217;t result in expert or near-expert performance. These businesses do see the need to harness their workers&#8217; knowledge, but sadly, they usually look for it in the wrong place. If knowledge is what people know, then the right place to find it is in people&#8217;s HEADS. You are pretty unlikely to find it in their documents, spreadsheets, and PowerPoint presentations. But that&#8217;s exactly where most organizations think knowledge resides &#8212; the &#8220;K: drive,&#8221; that shared place where we store all our files.  This isn&#8217;t impossible &#8212; a person can put his wisdom down in writing &#8212; it&#8217;s just improbable. Documents are most often about info, not knowledge. Did you ever turn to the Encyclopedia Brittanica to solve a thorny problem or make a tough decision?</p>
<p>This notion that all these documents we business folk keep cranking out constitute the institutional knowledge base is not only wrong, it breeds two assumptions that throw us further off the scent from being able to capture the real knowledge:</p>
<ul>
<li><b>Mistaken Assumption #1:</b> A continuous supply of knowledge is a given
<li><b>Mistaken Assumption #2:</b> Knowledge is something to be mined
</ul>
<p>A bounteous knowledge supply is not a given because knowledge has to come from people, and people don&#8217;t usually commit their knowledge to writing because they are over-worked and under-motivated.  And even if they were moved to do it, there&#8217;s no home for their knowledge in what corporations traditionally (and mistakenly) think of as the knowledge base. Valuable knowledge walks out the door at 6:00 every day because people have nowhere to put it and the contribution method &#8212; cranking out a document &#8212; is too difficult.</p>
<p>Because businesses think the document dumping ground is a knowledge base, they are led to their second faulty point of view, which is that knowledge is something to be mined. Hey, there&#8217;s a lot of dreck on the K: drive, so if there are <i>any</i> nuggets of wisdom in there, you&#8217;re gonna need to do some mining, right? The whole enterprise search industry depends on this attitude. But mining is the wrong point of view. It implies a scarce supply of something valuable trapped inside a nearly endless supply of something worthless. Sound like your company&#8217;s shared drive?</p>
<p>What we need to do is cultivate knowledge, not mine it. But how do you get at what people are carrying around in their heads? We know from the explosion of the web that there are a lot of would-be content contributors out there. It&#8217;s no longer a hope or wish that if you give people a way to contribute what they know, many of them will do it freely. We need to make it easy, though. And we need to stop being afraid of it &#8212; some organizations legislate this sort of behavior out of existence. Here&#8217;s what I think are the essentials:</p>
<ul>
<li>Provide new kinds of tools so people can easily capture and contribute their insights without having to slog through the process of writing a document
<li>Give people tools that connect them either to the knowledge they are looking for or to like-minded collaborators
<li>Take active steps to stimulate the flow of ideas between collaborators so that insights and innovations can occur
</ul>
<p>I see this as a self-reinforcing loop: <b>capture</b> what people know (both their long-standing know-how and their newly-formed &#8220;Eureka!&#8221; moments), <b>connect</b> people to knowledge and to each other, <b>stimulate</b> the creation and flow of ideas, and repeat from the top. With this loop in place, you really can have a knowledge repository rather than a file archive. And with more know-how and less dreck in the repository, employees stand a much better chance of latching onto an insight that will improve their performance and make an actual difference for their organization.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/psterpe.wordpress.com/151/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/psterpe.wordpress.com/151/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/psterpe.wordpress.com/151/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/psterpe.wordpress.com/151/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/psterpe.wordpress.com/151/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/psterpe.wordpress.com/151/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/psterpe.wordpress.com/151/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/psterpe.wordpress.com/151/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/psterpe.wordpress.com/151/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/psterpe.wordpress.com/151/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/psterpe.wordpress.com/151/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/psterpe.wordpress.com/151/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/psterpe.wordpress.com/151/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/psterpe.wordpress.com/151/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=psterpe.wordpress.com&amp;blog=6846254&amp;post=151&amp;subd=psterpe&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://psterpe.wordpress.com/2009/07/24/dont-mine-knowledge-cultivate-it/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/045720d31ca7bbf213c0496f576ff9a3?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">psterpe</media:title>
		</media:content>
	</item>
		<item>
		<title>Running a SharePoint App From Your Own Copy of the Layouts Folder</title>
		<link>http://psterpe.wordpress.com/2009/06/02/running-a-sharepoint-app-from-your-own-copy-of-the-layouts-folder/</link>
		<comments>http://psterpe.wordpress.com/2009/06/02/running-a-sharepoint-app-from-your-own-copy-of-the-layouts-folder/#comments</comments>
		<pubDate>Tue, 02 Jun 2009 21:14:12 +0000</pubDate>
		<dc:creator>psterpe</dc:creator>
				<category><![CDATA[SharePoint]]></category>
		<category><![CDATA[customization]]></category>

		<guid isPermaLink="false">http://psterpe.wordpress.com/?p=138</guid>
		<description><![CDATA[Did you ever want to tinker with some of the ASPX pages in the layouts folder of the SharePoint hive? You might want to customize the appearance of application.master, for example. Or, you might want to diverge from the released _layouts pages so that some web apps use your customized versions. When Microsoft releases patches, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=psterpe.wordpress.com&amp;blog=6846254&amp;post=138&amp;subd=psterpe&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Did you ever want to tinker with some of the ASPX pages in the <code>layouts</code> folder of the SharePoint hive? You might want to customize the appearance of application.master, for example. Or, you might want to diverge from the released _layouts pages so that some web apps use your customized versions. When Microsoft releases patches, they&#8217;ll be installed in the hive, thereby giving you the chance to run a <code>diff</code> to see what you need to migrate into your copied folder. With sufficient permissions, you can edit the layouts pages directly of course, but it&#8217;d be safer to work with your own private copy until you know your changes are safe to be unleashed on an unsuspecting populous. Here&#8217;s how to point a web app at your local copy of the layouts folder.</p>
<ol>
<li>Make your own copy of the layouts folder
<p>SharePoint&#8217;s _layouts pages are at this oh-so-easy-to-remember location: <code>C:\Program Files\Common Files\Microsoft Shared\Web Server Extension\12\template\layouts</code>. Copy this folder and paste it wherever you want if you&#8217;re just hacking around. If you plan to run a production web app from your copy of layouts, a good place to put the copy might be <code>C:\Inetpub\wwwroot\webapps\your_web_app\layouts</code>. You might have to adjust the file system permissions on the folder containing your layouts copy &#8212; whichever user your web app runs as (typically ASPNET) will need Read access.</p>
<li>Point your web app at your copy
<p>Open IIS Manager, navigate to your web app, and expand the tree so that you can see the _layouts folder; it will look like the figure below.</p>
<p><a href="http://psterpe.files.wordpress.com/2009/06/iis_layouts_1.png"><img src="http://psterpe.files.wordpress.com/2009/06/iis_layouts_1.png?w=223&#038;h=263" alt="IIS_layouts_1" title="IIS_layouts_1" width="223" height="263" class="aligncenter size-full wp-image-139" /></a></p>
<p>Right-click the _layouts folder, and select Properties from the context menu. On the Virtual Directory tab, select the radio button indicating that the content should come from &#8220;A directory on this computer&#8221; and in the Local path field, enter the full path to the location of your copy of the layouts folder. Make sure the box for Read access is checked, and check any others that pertain. Then click OK.</p>
<p><a href="http://psterpe.files.wordpress.com/2009/06/iis_layouts_21.png"><img src="http://psterpe.files.wordpress.com/2009/06/iis_layouts_21.png?w=471&#038;h=455" alt="IIS_layouts_2" title="IIS_layouts_2" width="471" height="455" class="aligncenter size-full wp-image-140" /></a></p>
<li>Run the <code>iisreset</code> command.
</ol>
<p>Your app will now use the files in your copy of layouts for all of SharePoint&#8217;s _layouts pages.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/psterpe.wordpress.com/138/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/psterpe.wordpress.com/138/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/psterpe.wordpress.com/138/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/psterpe.wordpress.com/138/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/psterpe.wordpress.com/138/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/psterpe.wordpress.com/138/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/psterpe.wordpress.com/138/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/psterpe.wordpress.com/138/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/psterpe.wordpress.com/138/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/psterpe.wordpress.com/138/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/psterpe.wordpress.com/138/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/psterpe.wordpress.com/138/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/psterpe.wordpress.com/138/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/psterpe.wordpress.com/138/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=psterpe.wordpress.com&amp;blog=6846254&amp;post=138&amp;subd=psterpe&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://psterpe.wordpress.com/2009/06/02/running-a-sharepoint-app-from-your-own-copy-of-the-layouts-folder/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/045720d31ca7bbf213c0496f576ff9a3?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">psterpe</media:title>
		</media:content>

		<media:content url="http://psterpe.files.wordpress.com/2009/06/iis_layouts_1.png" medium="image">
			<media:title type="html">IIS_layouts_1</media:title>
		</media:content>

		<media:content url="http://psterpe.files.wordpress.com/2009/06/iis_layouts_21.png" medium="image">
			<media:title type="html">IIS_layouts_2</media:title>
		</media:content>
	</item>
		<item>
		<title>Can&#8217;t Deactivate Trackpad in Leopard &#8212; A (Lame) Workaround</title>
		<link>http://psterpe.wordpress.com/2009/05/31/cant-deactivate-trackpad-in-leopard-a-lame-workaround/</link>
		<comments>http://psterpe.wordpress.com/2009/05/31/cant-deactivate-trackpad-in-leopard-a-lame-workaround/#comments</comments>
		<pubDate>Sun, 31 May 2009 20:03:01 +0000</pubDate>
		<dc:creator>psterpe</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Leopard]]></category>
		<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[trackpad]]></category>

		<guid isPermaLink="false">http://psterpe.wordpress.com/?p=131</guid>
		<description><![CDATA[Almost a year ago, I became a &#8220;switcher&#8221; &#8212; someone who abandons the PC and Windows for the Macintosh and Mac OS. I joined the party as of the &#8220;Leopard&#8221; release of Mac OS X. I have dutifully installed the Leopard point releases as they have come along. The release notes haven&#8217;t told me much, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=psterpe.wordpress.com&amp;blog=6846254&amp;post=131&amp;subd=psterpe&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Almost a year ago, I became a &#8220;switcher&#8221; &#8212; someone who abandons the PC and Windows for the Macintosh and Mac OS. I joined the party as of the &#8220;Leopard&#8221; release of Mac OS X. I have dutifully installed the Leopard point releases as they have come along. The release notes haven&#8217;t told me much, and after the first leap of faith worked out fine, I just kept on installing the updates. Two weeks ago, I installed the 10.5.7 update, and for the first time, I was sorry I had updated.</p>
<p>I have to believe this is a bug &#8212; someone at Apple has to have goofed, because what they did with the trackpad is just plain dumb. You used to be able to deactivate the trackpad while an external (in my case, USB) mouse was connected. As someone whom Mavis Beacon would flunk for poor typing technique, I tend to lean on the trackpad when I don&#8217;t mean to, which causes unintentional clicks and selections. At times whole new windows appear and disappear mid-sentence, and I have no clue what I leaned on to cause this. My best solution was simply to disable the trackpad when I had another mouse to work with.</p>
<p>The ability to deactivate the trackpad used to be a setting; at some point (I think 10.5.6, but I&#8217;m happy to stand corrected on that), the option disappeared because the capability was just built into the OS &#8211; connect a device, the trackpad deactivates. For me, perfection. With the 10.5.7 release, however, you CANNOT deactivate the trackpad. Connecting an external mouse doesn&#8217;t do it, nor can you find a setting for it. One clever forum poster suggested you could enable the accessibility feature &#8220;Mouse Keys&#8221; and thereby disable the trackpad &#8212; nopers. Other forum posters familiar with Leopard&#8217;s default system tried tinkering with the setting <code>"com.apple.mouse.ignoreTrackpadIfMousePresent" = 1</code>, but this setting is now ignored. I resolved to start looking for a PC to replace my Macbook Pro.</p>
<p>And then the obvious hit me. It was a Homer Simpson-esque &#8220;D&#8217;oh!!&#8221; moment. The trackpad has <i>features</i>. You may not be able to kill it, but certainly you can stop it from doing things, right? Right. When I looked at the trackpad settings, I saw this:<br />
<a href="http://psterpe.files.wordpress.com/2009/05/trackpad1.png"><img src="http://psterpe.files.wordpress.com/2009/05/trackpad1.png?w=331&#038;h=131" alt="Trackpad1" title="Trackpad1" width="331" height="131" class="aligncenter size-full wp-image-129" /></a></p>
<p>All I had to do was uncheck the boxes for Tap to click and Dragging. I ended up with this:<br />
<a href="http://psterpe.files.wordpress.com/2009/05/trackpad2.png"><img src="http://psterpe.files.wordpress.com/2009/05/trackpad2.png?w=329&#038;h=130" alt="Trackpad2" title="Trackpad2" width="329" height="130" class="aligncenter size-full wp-image-130" /></a></p>
<p>For me, this solves the problem. When I sloppily lean on the trackpad, the cursor still moves, but the trackpad cannot cause a click or a drag to occur. So, where my next typed character gets inserted cannot be altered. (I guess if you were running X11 and had enabled the setting to give focus to a window once the mouse enters it, my workaround would not solve your problems. I personally abandoned that X11 setting in 1989, but I digress&#8230;.)</p>
<p>When I disconnect my external mouse and really want to use the trackpad, it still works for moving the mouse cursor. I can&#8217;t tap the trackpad to click, though &#8212; I have that feature disabled. I can either re-enable that feature through settings, or I can just hit the (too large to ever miss) button. I use the button &#8212; tapping is less comfy for me anyway.</p>
<p>Disgruntled users have discussed this &#8220;feature&#8221; in 10.5.7 in this <a href="http://discussions.apple.com/thread.jspa?threadID=2005660">Apple discussions thread</a>. I&#8217;ll be following the thread to see if anyone learns whether Apple intended this feature change or just goofed.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/psterpe.wordpress.com/131/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/psterpe.wordpress.com/131/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/psterpe.wordpress.com/131/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/psterpe.wordpress.com/131/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/psterpe.wordpress.com/131/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/psterpe.wordpress.com/131/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/psterpe.wordpress.com/131/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/psterpe.wordpress.com/131/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/psterpe.wordpress.com/131/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/psterpe.wordpress.com/131/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/psterpe.wordpress.com/131/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/psterpe.wordpress.com/131/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/psterpe.wordpress.com/131/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/psterpe.wordpress.com/131/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=psterpe.wordpress.com&amp;blog=6846254&amp;post=131&amp;subd=psterpe&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://psterpe.wordpress.com/2009/05/31/cant-deactivate-trackpad-in-leopard-a-lame-workaround/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/045720d31ca7bbf213c0496f576ff9a3?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">psterpe</media:title>
		</media:content>

		<media:content url="http://psterpe.files.wordpress.com/2009/05/trackpad1.png" medium="image">
			<media:title type="html">Trackpad1</media:title>
		</media:content>

		<media:content url="http://psterpe.files.wordpress.com/2009/05/trackpad2.png" medium="image">
			<media:title type="html">Trackpad2</media:title>
		</media:content>
	</item>
		<item>
		<title>Adding Users With SharePoint Forms Based Authentication</title>
		<link>http://psterpe.wordpress.com/2009/05/24/adding-users-with-sharepoint-forms-based-authentication/</link>
		<comments>http://psterpe.wordpress.com/2009/05/24/adding-users-with-sharepoint-forms-based-authentication/#comments</comments>
		<pubDate>Sun, 24 May 2009 21:53:59 +0000</pubDate>
		<dc:creator>psterpe</dc:creator>
				<category><![CDATA[SharePoint]]></category>
		<category><![CDATA[Forms Based Authenticaion]]></category>
		<category><![CDATA[HowTo]]></category>

		<guid isPermaLink="false">http://psterpe.wordpress.com/?p=107</guid>
		<description><![CDATA[Some folks have found my blog by searching for &#8220;how to add users to SharePoint with Forms Based Authentication.&#8221; In my second article on FBA, I mostly pointed to other sites at which people have done a nice job describing this, but I didn&#8217;t show the code I used. In case that&#8217;d be helpful for [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=psterpe.wordpress.com&amp;blog=6846254&amp;post=107&amp;subd=psterpe&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Some folks have found my blog by searching for &#8220;how to add users to SharePoint with Forms Based Authentication.&#8221; In my <a href="http://psterpe.wordpress.com/2009/03/06/adventures-in-sharepoint-forms-based-authentication-part-2/">second article on FBA</a>, I mostly pointed to other sites at which people have done a nice job describing this, but I didn&#8217;t show the code I used. In case that&#8217;d be helpful for someone, I&#8217;ll show a few of the highlights here. There is nothing SharePoint-y about adding users through Forms Based Authentication (FBA) &#8212; it&#8217;s all .NET-y, done most easily with the ASP.NET CreateUserWizard control. What follows are some pointers on how to use that control.</p>
<p>The CreateUserWizard control gives you a way to gather several fields of information about a prospective user and create a database record for that person in the membership table. As <a href="http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.createuserwizard.aspx">Microsoft&#8217;s documentation of the control shows</a>, it can do a lot; here I show the basics. What makes the control a wizard is that it allows you to architect a multi-step, multi-page process for gathering factoids in which you don&#8217;t need to build the pages or even the inter-page buttons. You use tags to describe what you want, and the control supplies the data entry fields, the navigation, and the processing logic.</p>
<p>Below is a sample usage of the CreateUserWizard control to gather a username and password. In this example, we use an email address as a username (and even enforce this, syntactically, with a regular expression validator). This may look like sausage making, but it isn&#8217;t all that involved, and I&#8217;ll explain each ingredient. Aside from the page directives at the top that make this behave like a SharePoint page, this is .NET all the way.</p>
<pre class="brush: plain;">
&lt;%@ Assembly Name=&quot;Microsoft.SharePoint.ApplicationPages, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c&quot;%&gt;
&lt;%@ Page Language=&quot;C#&quot; Inherits=&quot;Microsoft.SharePoint.ApplicationPages.LoginPage&quot; MasterPageFile=&quot;~/_layouts/simple.master&quot;%&gt;
&lt;%@ Import Namespace=&quot;Microsoft.SharePoint.ApplicationPages&quot; %&gt;
&lt;%@ Register Tagprefix=&quot;SharePoint&quot; Namespace=&quot;Microsoft.SharePoint.WebControls&quot; Assembly=&quot;Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c&quot; %&gt;
&lt;%@ Register Tagprefix=&quot;Utilities&quot; Namespace=&quot;Microsoft.SharePoint.Utilities&quot; Assembly=&quot;Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c&quot; %&gt;
&lt;%@ Import Namespace=&quot;Microsoft.SharePoint&quot; %&gt;
&lt;asp:CreateUserWizard runat=&quot;server&quot; ID=&quot;CreateUserWizard1&quot; OnCreatedUser=&quot;CreateUserWizard1_CreatedUser&quot;
    RequireEmail=&quot;True&quot; DisableCreatedUser=&quot;false&quot; OnSendingMail=&quot;CreateUserWizard1_SendingMail&quot;&gt;
    &lt;WizardSteps&gt;
	&lt;asp:CreateUserWizardStep runat=&quot;server&quot; Title=&quot;Register&quot; ID=&quot;TheStep&quot;&gt;
	    &lt;ContentTemplate&gt;
		&lt;table&gt;
		    &lt;tr&gt;
			&lt;td colspan=&quot;2&quot; align=&quot;center&quot;&gt;
			    Make an Account&lt;/td&gt;
		    &lt;/tr&gt;
		    &lt;tr&gt;
			&lt;td colspan=&quot;2&quot; style=&quot;color:red&quot;&gt;
			    &lt;asp:Literal ID=&quot;ErrorMessage&quot; runat=&quot;server&quot; EnableViewState=&quot;False&quot;&gt;&lt;/asp:Literal&gt;
			&lt;/td&gt;
		    &lt;/tr&gt;
		    &lt;tr&gt;
			&lt;td colspan=&quot;2&quot;&gt;
			    User Name &amp;amp; Password&lt;/td&gt;
		    &lt;/tr&gt;
		    &lt;tr&gt;
			&lt;td class=&quot;ms-formlabel&quot; style=&quot;width: 25%;&quot;&gt;
			    Email &lt;font size=&quot;-2&quot;&gt;(will be your user name)&lt;/font&gt;&lt;/td&gt;
			&lt;td class=&quot;ms-formbody&quot; style=&quot;width: 75%;&quot;&gt;
			    &lt;asp:TextBox runat=&quot;server&quot; ID=&quot;UserName&quot; Columns=&quot;50&quot; /&gt;
			    &lt;asp:RequiredFieldValidator ValidationGroup=&quot;CreateUserWizard1&quot; runat=&quot;server&quot; ID=&quot;UserNameValidator&quot;
				ControlToValidate=&quot;UserName&quot; Display=&quot;Dynamic&quot; ErrorMessage=&quot;Email is required. This will be your username.&quot; /&gt;
			    &lt;asp:RegularExpressionValidator ValidationGroup=&quot;CreateUserWizard1&quot; runat=&quot;server&quot;
				ID=&quot;RegexValidator0&quot; ControlToValidate=&quot;UserName&quot; Display=&quot;Dynamic&quot; ErrorMessage=&quot;Please enter a valid email address.&quot;
				ValidationExpression=&quot;\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*&quot; /&gt;
			&lt;/td&gt;
		    &lt;/tr&gt;
		    &lt;tr&gt;
			&lt;td class=&quot;ms-formlabel&quot;&gt;
			    Password&lt;/td&gt;
			&lt;td class=&quot;ms-formbody&quot;&gt;
			    &lt;asp:TextBox runat=&quot;server&quot; ID=&quot;Password&quot; TextMode=&quot;Password&quot; /&gt;
			    &lt;asp:RequiredFieldValidator ValidationGroup=&quot;CreateUserWizard1&quot; runat=&quot;server&quot; ID=&quot;RequiredFieldValidator10&quot;
				ControlToValidate=&quot;Password&quot; ErrorMessage=&quot;Password is required.&quot; /&gt;
			&lt;/td&gt;
		    &lt;/tr&gt;
		    &lt;tr&gt;
			&lt;td class=&quot;ms-formlabel&quot;&gt;
			    Confirm Password&lt;/td&gt;
			&lt;td class=&quot;ms-formbody&quot;&gt;
			    &lt;asp:TextBox runat=&quot;server&quot; ID=&quot;ConfirmPassword&quot; TextMode=&quot;Password&quot; /&gt;
			    &lt;asp:RequiredFieldValidator ValidationGroup=&quot;CreateUserWizard1&quot; runat=&quot;server&quot; ID=&quot;RequiredFieldValidator13&quot;
				ControlToValidate=&quot;ConfirmPassword&quot; ErrorMessage=&quot;Confirm Password is required.&quot; /&gt;
			&lt;/td&gt;
		    &lt;/tr&gt;
		    &lt;tr&gt;
			&lt;td colspan=&quot;2&quot;&gt;
			    Personal Information&lt;/td&gt;
		    &lt;/tr&gt;
		    &lt;tr&gt;
			&lt;td class=&quot;ms-formlabel&quot;&gt;
			    First Name&lt;/td&gt;
			&lt;td class=&quot;ms-formbody&quot;&gt;
			    &lt;asp:TextBox runat=&quot;server&quot; ID=&quot;FirstName&quot; Columns=&quot;32&quot; MaxLength=&quot;64&quot; /&gt;
			    &lt;asp:RequiredFieldValidator ValidationGroup=&quot;CreateUserWizard1&quot; runat=&quot;server&quot; ID=&quot;RequiredFieldValidatorFName&quot;
				ControlToValidate=&quot;FirstName&quot; ErrorMessage=&quot;First name is required.&quot; /&gt;
			&lt;/td&gt;
		    &lt;/tr&gt;
		    &lt;tr&gt;
			&lt;td class=&quot;ms-formlabel&quot;&gt;
			    Last Name&lt;/td&gt;
			&lt;td class=&quot;ms-formbody&quot;&gt;
			    &lt;asp:TextBox runat=&quot;server&quot; ID=&quot;LastName&quot; Columns=&quot;32&quot; MaxLength=&quot;64&quot; /&gt;
			    &lt;asp:RequiredFieldValidator ValidationGroup=&quot;CreateUserWizard1&quot; runat=&quot;server&quot; ID=&quot;RequiredFieldValidatorLName&quot;
				ControlToValidate=&quot;LastName&quot; ErrorMessage=&quot;Last name is required.&quot; /&gt;
			&lt;/td&gt;
		    &lt;/tr&gt;
		    &lt;tr&gt;
			&lt;td colspan=&quot;2&quot;&gt;
			    &lt;asp:CompareValidator ID=&quot;PasswordCompare&quot; runat=&quot;server&quot; ControlToCompare=&quot;Password&quot;
				ControlToValidate=&quot;ConfirmPassword&quot; Display=&quot;Dynamic&quot; ErrorMessage=&quot;The Password and Confirmation Password must match.&quot;&gt;&lt;/asp:CompareValidator&gt;
			&lt;/td&gt;
		    &lt;/tr&gt;
		&lt;/table&gt;
		&lt;asp:TextBox runat=&quot;server&quot; ID=&quot;Email&quot; Style=&quot;visibility: hidden&quot; /&gt;
	    &lt;/ContentTemplate&gt;
	&lt;/asp:CreateUserWizardStep&gt;
	&lt;asp:CompleteWizardStep ID=&quot;CompleteWizardStep1&quot; runat=&quot;server&quot;&gt;
	&lt;/asp:CompleteWizardStep&gt;
    &lt;/WizardSteps&gt;
    &lt;SideBarStyle BackColor=&quot;#5D7B9D&quot; BorderWidth=&quot;0px&quot; Font-Size=&quot;0.9em&quot; VerticalAlign=&quot;Top&quot; /&gt;
    &lt;TitleTextStyle BackColor=&quot;#5D7B9D&quot; ForeColor=&quot;White&quot; Font-Bold=&quot;True&quot; /&gt;
    &lt;SideBarButtonStyle ForeColor=&quot;White&quot; BorderWidth=&quot;0px&quot; Font-Names=&quot;Verdana&quot; /&gt;
    &lt;NavigationButtonStyle BackColor=&quot;#FFFBFF&quot; BorderStyle=&quot;Solid&quot; ForeColor=&quot;#284775&quot;
	BorderWidth=&quot;1px&quot; BorderColor=&quot;#CCCCCC&quot; Font-Names=&quot;Verdana&quot; /&gt;
    &lt;HeaderStyle BackColor=&quot;#5D7B9D&quot; BorderStyle=&quot;Solid&quot; ForeColor=&quot;White&quot; HorizontalAlign=&quot;Center&quot;
	Font-Size=&quot;0.9em&quot; Font-Bold=&quot;True&quot; /&gt;
    &lt;CreateUserButtonStyle BackColor=&quot;#FFFBFF&quot; BorderStyle=&quot;Solid&quot; ForeColor=&quot;#284775&quot;
	BorderWidth=&quot;1px&quot; BorderColor=&quot;#CCCCCC&quot; Font-Names=&quot;Verdana&quot; /&gt;
    &lt;ContinueButtonStyle BackColor=&quot;#FFFBFF&quot; BorderStyle=&quot;Solid&quot; ForeColor=&quot;#284775&quot;
	BorderWidth=&quot;1px&quot; BorderColor=&quot;#CCCCCC&quot; Font-Names=&quot;Verdana&quot; /&gt;
    &lt;StepStyle BorderWidth=&quot;0px&quot; /&gt;
    &lt;StepNavigationTemplate&gt;
	&lt;asp:Button ID=&quot;StepPreviousButton&quot; runat=&quot;server&quot; BackColor=&quot;#FFFBFF&quot; BorderColor=&quot;#CCCCCC&quot;
	    BorderStyle=&quot;Solid&quot; BorderWidth=&quot;1px&quot; CausesValidation=&quot;False&quot; CommandName=&quot;MovePrevious&quot;
	    Font-Names=&quot;Verdana&quot; ForeColor=&quot;#284775&quot; Text=&quot;Previous&quot; /&gt;
	&lt;asp:Button ID=&quot;StepNextButton&quot; runat=&quot;server&quot; BackColor=&quot;#FFFBFF&quot; BorderColor=&quot;#CCCCCC&quot;
	    BorderStyle=&quot;Solid&quot; BorderWidth=&quot;1px&quot; CommandName=&quot;MoveNext&quot; Font-Names=&quot;Verdana&quot;
	    ForeColor=&quot;#284775&quot; Text=&quot;Next&quot; /&gt;
    &lt;/StepNavigationTemplate&gt;
&lt;/asp:CreateUserWizard&gt;
</pre>
<p>Here&#8217;s a screenshot of what the code above produces:<br />
<div id="attachment_113" class="wp-caption aligncenter" style="width: 581px"><a href="http://psterpe.files.wordpress.com/2009/05/makeanaccount.png"><img src="http://psterpe.files.wordpress.com/2009/05/makeanaccount.png?w=571&#038;h=315" alt="Rendered CreateUserWizard control for making a new user account" title="MakeAnAccount" width="571" height="315" class="size-full wp-image-113" /></a><p class="wp-caption-text">Rendered CreateUserWizard control for making a new user account</p></div></p>
<p>Now let&#8217;s dig into each bit of the code above and talk about why it&#8217;s there and what it produces. First up is the opening tag of the CreateUserWizard control, formatted here with plenty of line breaks so you can read it more easily:</p>
<pre class="brush: plain;">
&lt;asp:CreateUserWizard runat=&quot;server&quot; ID=&quot;CreateUserWizard1&quot;
    OnCreatedUser=&quot;CreateUserWizard1_CreatedUser&quot;
    OnSendingMail=&quot;CreateUserWizard1_SendingMail&quot;
    RequireEmail=&quot;True&quot;
    DisableCreatedUser=&quot;false&quot; &gt;
</pre>
<p>Of course don&#8217;t forget the <code>runat="server,"</code> and definitely give the control an ID. You&#8217;ll need the ID in any code you write to tweak how things work; I&#8217;ll show some of my C# code later in the post. The OnCreatedUser and OnSendingMail attributes specify event handlers, that is, they name C# methods that should be called when these events fire. Here&#8217;s a summary of the two events I&#8217;m handling:</p>
<ul>
<li><em>OnCreatedUser</em>. When the wizard has succeeded in inserting a database record for the user, this event fires. So what&#8217;s left to do once the user&#8217;s database record has been created? Nothing is required, so you don&#8217;t have to have this handler, but if you&#8217;re using the custom profile provider for storing ancillary user information, this is when you&#8217;d create the user&#8217;s profile record. See <a href="#handlerCreatedUser">CreateUserWizard1_CreatedUser()</a> for a simple example.
<li><em>OnSendingMail</em>. You can arrange for the CreateUserWizard control to send an email to the newly created user; you&#8217;d most likely make this a welcome message. Just before that welcome email is sent, this event fires. This is another event that you don&#8217;t have to handle, but there&#8217;s something very useful you can do in the handler, namely, to substitute data values on-the-fly into the otherwise canned text of your welcome email. See <a href="#handlerSendingMail">CreateUserWizard1_SendingMail()</a> for a simple example.
<p>To get the wizard to send the mail at all, you do three things:</p>
<ol>
<li>Ensure that you have defined a field within the control whose ID is &#8220;Email.&#8221;
<li>In the control&#8217;s opening tag, put <code>RequireEmail="True"</code>.
<li>Set the control&#8217;s MailDefinition properties, being sure that the BodyFileName property points to a file that exists and is readable. You can set the MailDefinition properties declaratively with tags, or you can do it in code. Here&#8217;s an example of doing it in code in the Page_Load() handler:
<p>CreateUserWizard1.MailDefinition.BodyFileName = &quot;~/MailFiles/MailFile.txt&quot;;<br />
CreateUserWizard1.MailDefinition.From = &quot;peter.sterpe@sympraxisconsulting.com&quot;;<br />
CreateUserWizard1.MailDefinition.Subject = &quot;Welcome to the Site&quot;;<br />
CreateUserWizard1.MailDefinition.IsBodyHtml = true;</p>
</ol>
<p>In our case, you might have noticed that the &#8220;Email&#8221; field is hidden:</p>
<pre class="brush: xml;">
&lt;asp:TextBox runat=&quot;server&quot; ID=&quot;Email&quot; Style=&quot;visibility: hidden&quot; /&gt;
</pre>
<p>We&#8217;re capturing the username in a field whose ID is &#8220;UserName&#8221; rather than using the &#8220;Email&#8221; field for this purpose. Necessary? No. I just wanted any application code to refer to &#8220;Username&#8221; when that&#8217;s what it&#8217;s really working with. This value will be used for authentication, so I wanted to call it what it is. To get the wizard to send the welcome mail, there has to be an &#8220;Email&#8221; field, so that field exists &#8212; hidden &#8212; and a little JavaScript copies the Username value into it. <a href="http://psterpe.wordpress.com/2009/03/17/client-side-javascript-event-handlers-for-aspnet-controls-how/">My post on how to do client-side event handlers in Javascript</a> shows you the code for doing this kind of thing.
</ul>
<p>Completing our look at the opening tag, the attribute <code>DisableCreatedUser="false"</code> tells the wizard whether the newly created user account should be enabled or disabled. If it is enabled, the user can log in immediately; if the account is disabled, an activation step has to occur before the user can login. In the latter case, you&#8217;d typically include a link in the welcome mail that, once followed, causes the user&#8217;s account to be activated. This technique provides a little bit of fraud protection &#8212; although I can try to impersonate you by registering with your email address, I won&#8217;t receive the welcome message and therefore won&#8217;t be able to activate the account. To accomplish the activation, you instantitate a <code>MembershipUser</code> object, set its <code>IsApproved</code> property to True, and update it. Here&#8217;s a code snippet for that:</p>
<pre class="brush: plain;">
// Declare userID as a GUID and set it to the user's internal id value from the aspnet_Membership table. Then use the following
// lines to activate the user's account.
MembershipUser userInfo = Membership.GetUser(userID);
userInfo.IsApproved = true;
Membership.UpdateUser(userInfo);
</pre>
<p>After the CreateUserWizard opening tag, the control must contain one or more steps, declared with the <code></code>element, all nested within a <code>WizardSteps</code>element. Each step will correspond to a new page. In our simple example, we define only one step whose id is &#8220;TheStep.&#8221; The wizard lets you designate a special completion step, using the <code></code> element, for any final processing. We declare that element but put nothing in it since we have nothing special to do. You could use this step to force the wizard to back up if, say, certain criteria hadn&#8217;t been met.</p>
<p>So what does our wizard do with its one step? Gather account registration data using text fields &#8212; noting earth-shattering. We put the fields in a 2-column table, one column for field labels and one for the data entry controls. All of this is embedded in a <code>ContentTemplate</code> element. The fields are typical .NET controls such as <code></code>; you can use drop-down lists or any other kinds of controls you want. In this example, I have defined some field validators, too, to enforce that required fields have a value and to enforce that the username field looks like an email address. To make everything look SharePoint-like, give the field labels the CSS class &#8220;ms-formlabel&#8221; and the data fields the CSS class &#8220;ms-formbody.&#8221; This is all basic .NET stuff described in a million places, so I&#8217;m not going to belabor it here.</p>
<p>The remainder of the elements in the CreateUserWizard control specify styles for the various regions of the control&#8217;s on-screen appearance, including its buttons. This is all optional; if you&#8217;re OK with the defaults, you can omit these elements entirely.</p>
<p>So, that&#8217;s all you need to do. No database code, no inter-page navigation &#8212; just declare the control and let the .NET framework do the rest.</p>
<p>I did decide to enrich the example a little by handling some events, so let&#8217;s look at what those handlers are like. <a name="handlerCreatedUser"></a>You don&#8217;t have to provide a handler for the OnCreatedUser event, but one thing you can do in such a handler is create your new user&#8217;s profile record. The database table for the .NET Membership provider, aspnet_Membership, holds just enough info to log a user in; it doesn&#8217;t store any related information like the user&#8217;s first and last name. (OK, I think that&#8217;s a <i>bit</i> streamlined.) To store those pesky factoids, you need the .NET Profile provider. Here&#8217;s a simple handler:</p>
<pre class="brush: plain;">
void CreateUserWizard1_CreatedUser(object sender, EventArgs e)
{
 TextBox UserNameTextBox = (TextBox)TheStep.ContentTemplateContainer.FindControl(&quot;UserName&quot;);

 // Save profile values common to all kinds of users.
 PJS.UserProfile profile = PJS.UserProfile.GetUserProfile(UserNameTextBox.Text);

 profile.FirstName = ((TextBox)TheStep.ContentTemplateContainer.FindControl(&quot;FirstName&quot;)).Text;
 profile.LastName = ((TextBox)TheStep.ContentTemplateContainer.FindControl(&quot;LastName&quot;)).Text;

 profile.Save();
}
 </pre>
<p>You also don&#8217;t have to handle the wizard&#8217;s OnSendingMail event, but <a name="handlerSendingMail"></a>one thing you can do in this handler is substitute data values into the text of your otherwise boilerplate welcome email. Here&#8217;s some sample email text that you&#8217;d store in a file:</p>
<pre class="brush: plain;">
&lt;p&gt;
Welcome to the site, &lt;%UserName%&gt;. Click on this link below to activate your membership: &lt;a href=&quot;&lt;%ActivationURL%&gt;&quot;&gt;&lt;%ActivationURL%&gt;&lt;/a&gt;
&lt;/p&gt;
</pre>
<p>In the text, anything between <code></code> is a placeholder for which you can substitute a value before the message goes out. Here&#8217;s some sample handler code that substitutes values for the UserName and ActivationURL placeholders:</p>
<pre class="brush: plain;">
void CreateUserWizard1_SendingMail(object sender, MailMessageEventArgs e)
{
    TextBox UserNameTextBox = (TextBox)TheStep.ContentTemplateContainer.FindControl(&quot;UserName&quot;);
    MembershipUser userInfo = Membership.GetUser(UserNameTextBox.Text);

    String activationURL = Request.Url.GetLeftPart(UriPartial.Authority) +
			   Page.ResolveUrl(&quot;~/_layouts/ActivateAccount.aspx?ID=&quot; +
			   userInfo.ProviderUserKey.ToString());
    e.Message.Body = e.Message.Body.Replace(&quot;&lt;%ActivationURL%&gt;&quot;, activationURL);
}
</pre>
<p>In an upcoming post, I&#8217;ll go into more detail about using a welcome email to get a newly registered user&#8217;s account activated.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/psterpe.wordpress.com/107/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/psterpe.wordpress.com/107/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/psterpe.wordpress.com/107/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/psterpe.wordpress.com/107/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/psterpe.wordpress.com/107/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/psterpe.wordpress.com/107/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/psterpe.wordpress.com/107/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/psterpe.wordpress.com/107/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/psterpe.wordpress.com/107/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/psterpe.wordpress.com/107/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/psterpe.wordpress.com/107/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/psterpe.wordpress.com/107/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/psterpe.wordpress.com/107/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/psterpe.wordpress.com/107/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=psterpe.wordpress.com&amp;blog=6846254&amp;post=107&amp;subd=psterpe&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://psterpe.wordpress.com/2009/05/24/adding-users-with-sharepoint-forms-based-authentication/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/045720d31ca7bbf213c0496f576ff9a3?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">psterpe</media:title>
		</media:content>

		<media:content url="http://psterpe.files.wordpress.com/2009/05/makeanaccount.png" medium="image">
			<media:title type="html">MakeAnAccount</media:title>
		</media:content>
	</item>
		<item>
		<title>Lite Survey of eCommerce Platforms</title>
		<link>http://psterpe.wordpress.com/2009/05/14/lite-survey-of-ecommerce-platforms/</link>
		<comments>http://psterpe.wordpress.com/2009/05/14/lite-survey-of-ecommerce-platforms/#comments</comments>
		<pubDate>Fri, 15 May 2009 02:02:14 +0000</pubDate>
		<dc:creator>psterpe</dc:creator>
				<category><![CDATA[eCommerce]]></category>

		<guid isPermaLink="false">http://psterpe.wordpress.com/?p=89</guid>
		<description><![CDATA[I&#8217;m helping a client get the lay of the land for ecommerce tools and platforms. If I lived in this land, I&#8217;d have to ask for directions a lot &#8212; the landscape is vast and featureless. I say &#8220;featureless&#8221; with tongue in cheek; ecommerce platforms are now bloatware, in my opinion, chock full of features, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=psterpe.wordpress.com&amp;blog=6846254&amp;post=89&amp;subd=psterpe&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m helping a client get the lay of the land for ecommerce tools and platforms. If I lived in this land, I&#8217;d have to ask for directions a lot &#8212; the landscape is vast and featureless. I say &#8220;featureless&#8221; with tongue in cheek; ecommerce platforms are now bloatware, in my opinion, chock full of features, but nearly all that I have encountered have about the same feature set. They&#8217;re so similar &#8220;you could throw a hat over them,&#8221; as my dad used to say. So how did I find a standout in such a me-too field?</p>
<p>Before I answer my own rhetorical question, here&#8217;s some background on the platforms I considered, and how I classified them. First of all, what are these things? Some products are toolkits of software and templates with which a fairly technical person can construct an online store, while other products are complete online stores right out of the box. And some are hybrids, giving you the skeleton store plus some tools and templates for making enhancements and customizations. So are they tools? Platforms? I opt to call them &#8220;platforms&#8221; with the understanding that some of them really are just SDKs.</p>
<p>How did I find these things? A good starting place is at Authorize.net where they list the platforms that have been certified to work with their payment gateway. Their Certified Solution Directory is at <a href="http://www.authorize.net/certified_solution_directory.asp">http://www.authorize.net/certified_solution_directory.asp</a>. I looked for &#8220;Shopping Cart&#8221; types of solutions and got over 70 choices on the day I ran the search. I was not able to exhaustively investigate all the listed solutions; I had to perform some triage and narrow in quickly on one that would meet my client&#8217;s needs. I didn&#8217;t want gigantic enterprise class solution suites that could drive commerce for a small country. I mostly cared about the ability to maintain control over all aspects of the online store, so my favored solutions were those that gave you the tools to build/maintain the store and deploy it anywhere. I specifically did not want a &#8220;just add water&#8221; solution in which a hosting provider controls the store and dictates what I can do with it while all I do is enter my product data. I realize that for non-technical proprietors, especially those operating very small businesses, the &#8220;Poof!  Here&#8217;s your store!&#8221; solutions may be nirvana. If that sort of solution is what you need, I have good news. You have choices &#8212; lots of &#8216;em. I don&#8217;t think you can even count how many choices you have; you need to measure them by the metric ton.</p>
<p>As I narrowed down the field, I arrived at three categories: <a href="#wsl">Worth A Second Look</a>, <a href="#maybes">Interesting Maybes</a>, and <a href="#rest">The Rest</a>. The grids I created appear below. These grids are sparse &#8212; I didn&#8217;t look deeply into every platform. Repeat, these grids are sparse. One more time: sparse grids below. If you know factoids about a platform that I didn&#8217;t capture, please leave a comment! Perhaps with some collaboration we can flesh out these grids (did I mention that they&#8217;re sparse?)</p>
<p>The platform I went with is <a href="http://www.ablecommerce.com">AbleCommerce</a>. For me, it stands out. Part of what attracted me to AbleCommerce was the feeling, before I knew it intimately, that I could <em>get somewhere</em> with it. And that intuition has been borne out. I easily developed a working prototype store into which I loaded sample data for 18,000+ products.</p>
<p>Some things I like about AbleCommerce:</p>
<ul>
<li>It&#8217;s feature-rich, but not over the top. It can handle product variants (e.g., size, color), product kits (the ability to build or customize something out of several parts each of which adds to or subtracts from the base price), digital products (things the customer downloads so nothing has to be shipped), promotion codes, volume discounts, customer reviews, customer ratings, marketing to a mailing list, email a friend, most popular.</li>
<li>A non-programmer can customize page layout and content, and most of this can be done from within the store pages without needing to visit the administration module</li>
<li>It has a nice administration module for the things that you do need to do there</li>
<li>It has a flexible architecture that isn&#8217;t ridiculous. There aren&#8217;t layers and layers of abstractions that beget other abstractions that beget factories that &#8212; if you can STAND to read that much documentation &#8212; eventually beget the silly little tweak you wanted to make. I easily copied their ASPX and C# code, made my own versions of things, and extended the system. And let&#8217;s just say that nobody has ever mistaken me for a hot shot .NET programmer.</li>
<li>The AbleCommerce developer forums are active &#8212; people use this platform and they help each other.</li>
<li>The bulk data upload/export tool, DataPort, works pretty well and has a very nice user interface. It lets you upload from either CSV or XML, and once it has read your source file, it lets you map your columns to the AbleCommerce data model very flexibly: you can map on-screen on the fly using the importer and save what you did as a template, you can map using an existing template, or you can map using their defaults. It can get picky during import, and its error messages need work, but I loaded over 18,000 product records without pulling my hair out.</li>
</ul>
<p>I wrote this post because I looked at, at least a little, a whole bunch of platforms, and I thought it might help someone conducting the same sort of search to see what I turned up. Have I directly used lots of tools in this field? No. So could other tools be as good as or even better than the ones I have singled out? Of course they could. And if you know things I don&#8217;t know, please leave a comment and educate us all.</p>
<p>Here are the products I considered.</p>
<h2><a name="wsl"></a>Worth a second look&#8230;</h2>
<p>I short-listed these because they seemed to meet my need of giving the store creator a lot of control. My technology preferences were ASP.NET and SQL Server, but I did consider platforms based on PHP, Java, or ColdFusion as well as those based on other databases. I was also interested in platforms that would allow bulk upload of product data from a file.</p>
<table style="border-collapse:collapse;border:none;" border="1" cellspacing="0" cellpadding="0">
<thead>
<tr style="background:#ADADAD;">
<td>Product</td>
<td>URL</td>
<td>Notes</td>
<td>Hosted</td>
<td>Software</td>
<td>Prog. Language</td>
<td>Database</td>
<td>Pricing</td>
</tr>
</thead>
<tbody>
<tr>
<td>AbleCommerce</td>
<td><a href="http://www.ablecommerce.com">http://www.ablecommerce.com</a></td>
<td>Does have bulk upload; free trial available. Easy to get going, permits plenty of<br />
customization without programming. Most source included.</td>
<td>x</td>
<td>x</td>
<td>ASP.NET</td>
<td></td>
<td>$995</td>
</tr>
<tr>
<td>AspDotNetStorefront</td>
<td><a href="http://www.aspdotnetstorefront.com">http://www.aspdotnetstorefront.com</a></td>
<td>PABP certified</p>
<p>Feature matrix at <a href="http://www.aspdotnetstorefront.com/t-features.aspx">http://www.aspdotnetstorefront.com/t-features.aspx</a></p>
<p>Bulk import only with Excel for Express; need<br />
regular ML to use XML or web services</td>
<td></td>
<td></td>
<td>ASP.NET</td>
<td>SQL Server 2005/2008</td>
<td>ML/Express $695; ML $1295</td>
</tr>
<tr>
<td>Click Cart Pro</td>
<td><a href="http://www.kryptronic.com/Shopping-Cart-Software">http://www.kryptronic.com/Shopping-Cart-Software</a></td>
<td>Feature list at <a href="http://www.kryptronic.com/Shopping-Cart-Software-Features">http://www.kryptronic.com/Shopping-Cart-Software-Features</a></p>
<p>Demo looks nice and runs well; somewhat busy,<br />
but probably to illustrate all you can do; Demo at <a href="http://www.kryptronic.com/demo/index.php">http://www.kryptronic.com/demo/index.php</a></td>
<td></td>
<td>x</td>
<td>PHP</td>
<td>SQL Server</td>
<td>$99 limited offer (1999 price<br />
rollback)</td>
</tr>
<tr>
<td>Interspire Shopping Cart</td>
<td><a href="http://www.interspire.com/shoppingcart">http://www.interspire.com/shoppingcart</a></td>
<td>Template-based with slick WYSIWYG drag-n-drop<br />
editing;</p>
<p>Feature list at</p>
<p>http://www.interspire.com/shoppingcart/features.php</td>
<td></td>
<td>x</td>
<td>PHP</td>
<td>MySQL</td>
<td>Starter ($295), Professional<br />
($995), Ultimate($1,795)</td>
</tr>
<tr>
<td>VP-ASP Shopping Cart</td>
<td><a href="http://www.vpasp.com">http://www.vpasp.com</a></td>
<td>Free trial supports only Access database;</p>
<p>3 payment gateways per license</p>
<p>Style templates $65; install with file overwrite</p>
<p>Admin very table-based, lots of id fields<br />
floating around</p>
<p>Admin screens are easy to understand with<br />
decent on-screen help; lots of store features are configurable</p>
<p>Source code in VB; oldish, not .NET</td>
<td></td>
<td>x</td>
<td>ASP</td>
<td>MySQL, SQL Server</td>
<td>from $245-$495</td>
</tr>
<tr>
<td>X-Cart</td>
<td><a href="http://www.x-cart.com">http://www.x-cart.com</a></td>
<td>30-day trial</td>
<td>x</td>
<td>x</td>
<td>PHP</td>
<td>MySQL</td>
<td>Gold $229, Pro $575</td>
</tr>
</tbody>
</table>
<h2><a name="maybes"></a>Interesting Maybes&#8230;</h2>
<table style="border-collapse:collapse;border:none;" border="1" cellspacing="0" cellpadding="0">
<thead>
<tr style="background:#ADADAD;">
<td>Product</td>
<td>URL</td>
<td>Notes</td>
<td>Hosted</td>
<td>Software</td>
<td>Prog. Language</td>
<td>Database</td>
<td>Pricing</td>
</tr>
</thead>
<tbody>
<tr>
<td>123 Shop Pro</td>
<td><a href="http://www.123ShopPro.com">http://www.123ShopPro.com</a></td>
<td>Features at <a href="http://www.123shoppro.com/feature.htm">http://www.123shoppro.com/feature.htm</a>;<br />
<a href="http://www.123shoppro.com/demo.htm">http://www.123shoppro.com/demo.htm</a></td>
<td></td>
<td>x</td>
<td>ASP</td>
<td>SQL Server</td>
<td>Standard $550, Advanced $850</td>
</tr>
<tr>
<td>5th Avenue Shoppe</td>
<td><a href="http://www.5th-avenue-software.com/">http://www.5th-avenue-software.com/</a></td>
<td><a href="http://artists-showcase.org/phpstore/store_pages/mainpage.php">http://artists-showcase.org/phpstore/store_pages/mainpage.php</a></p>
<p><a href="http://winelovers.5th-avenue-demo.com/store/store_pages/mainpage.php">http://winelovers.5th-avenue-demo.com/store/store_pages/mainpage.php</a></td>
<td></td>
<td>x</td>
<td>PHP;</p>
<p>Windows or Linux</td>
<td>MySQL or PostgreSQL</td>
<td>$395</td>
</tr>
<tr>
<td>WebAssist</td>
<td><a href="http://www.webassist.com">http://www.webassist.com</a></td>
<td>Various products; PowerStore seems like the right one; no free trial</td>
<td></td>
<td>x</td>
<td>PHP</td>
<td>MySQL</td>
<td>$299</td>
</tr>
<tr>
<td>Hostway Merchant Manager 4.5</td>
<td><a href="http://www.hostway.com/ecommerce/index.html">http://www.hostway.com/ecommerce/index.html</a></td>
<td>Signed up for online demo; always get 404 error</td>
<td>x</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>OS Commerce</td>
<td><a href="http://www.oscommerce.com/solutions">http://www.oscommerce.com/solutions</a></td>
<td>Open source</td>
<td></td>
<td>x</td>
<td>PHP</td>
<td>MySQL typically</td>
<td>Free</td>
</tr>
</tbody>
</table>
<h2><a name="rest"></a>The rest&#8230;</h2>
<p>The products in this grid are not necessarily inferior or weak compared to the ones in my most favored category. They mostly are just the wrong kind of product for what I wanted to do &#8212; most of these are hosted solutions geared toward non-technical people who wouldn&#8217;t want to change the programming of their online store even if learning to do so would grant them eternal life and an endless supply of donuts. No shame in that &#8212; they know their strengths. But solutions geared for that audience aren&#8217;t right for mine, so they quickly fell to the bottom of my list.</p>
<table style="border-collapse:collapse;border:none;" border="1" cellspacing="0" cellpadding="0">
<thead>
<tr style="background:#ADADAD;">
<td>Product</td>
<td>URL</td>
<td>Notes</td>
<td>Hosted</td>
<td>Software</td>
<td>Prog. Language</td>
<td>Database</td>
<td>Pricing</td>
</tr>
</thead>
<tbody>
<tr>
<td>Doba</td>
<td><a href="http://www.doba.com">www.doba.com</a></td>
<td>Interface to wholesalers who will drop ship</td>
<td>x</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>WordPress</td>
<td><a href="http://wordpress.org/support/topic/224202">http://wordpress.org/support/topic/224202</a></td>
<td>WordPress with shopping cart plugin; only good for very small shops.</td>
<td>x</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Elastic Path Software</td>
<td><a href="http://www.elasticpath.com">http://www.elasticpath.com</a></td>
<td>They say, &#8220;If your annual online revenue is less than $5 million,<br />
Elastic Path Commerce is probably too expensive for you.&#8221; Well, alrighty then.</td>
<td></td>
<td>x</td>
<td>Java, Velocity, Spring</td>
<td>Independent; uses Apache<br />
OpenJPA</td>
<td>Not posted</td>
</tr>
<tr>
<td>.netCART</td>
<td><a href="http://www.dotnetcart.com">http://www.dotnetcart.com</a></td>
<td>Seems to have the capabilities; very<br />
programming-oriented; not very pretty</p>
<p>Latest version 2.9.2844, 10/15/2007</p>
<p><a href="http://www.dotnetcart.com/demo/">http://www.dotnetcart.com/demo/</a></td>
<td></td>
<td>x</td>
<td>ASP.NET</td>
<td></td>
<td>$295 per store</td>
</tr>
<tr>
<td>1ShoppingCart.com</td>
<td><a href="http://www.1shoppingcart.com/">http://www.1shoppingcart.com/</a></td>
<td></td>
<td>x</td>
<td></td>
<td></td>
<td></td>
<td>Basic $59/month or $599/year;<br />
Professional $99/month or $999/year</td>
</tr>
<tr>
<td>AAcart</td>
<td><a href="http://www.aacart.com">http://www.aacart.com</a></td>
<td>Demo stores work very well; <a href="http://www.aacart.com/ecommerce-shopping-cart-software/shopping-cart-demo-store.html">http://www.aacart.com/ecommerce-shopping-cart-software/shopping-cart-demo-store.html</a></td>
<td>x</td>
<td></td>
<td></td>
<td></td>
<td>Setup from $0-399; monthly<br />
hosting from $19-69</td>
</tr>
<tr>
<td>Advanced Cart v2.11A</td>
<td><a href="http://www.bsmstore.com">http://www.bsmstore.com</a></td>
<td>Standalone shopping cart only; not catalog<br />
management</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Agile Cart</td>
<td><a href="http://www.eastland.com/carts.html">http://www.eastland.com/carts.html</a></td>
<td><a href="http://www.eastland.com/AgileDemo.html">http://www.eastland.com/AgileDemo.html</a></td>
<td></td>
<td>x</td>
<td>ColdFusion and PHP</td>
<td></td>
<td>$395</td>
</tr>
<tr>
<td>Americart</td>
<td><a href="http://www.americart.com">http://www.americart.com</a></td>
<td></td>
<td>x</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>ampleShop</td>
<td><a href="http://www.amplecom.com">http://www.amplecom.com</a></td>
<td>&#8220;Our company is based in Macedonia with representatives<br />
in the US and Switzerland&#8221;</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Andale Auction Management Tools</td>
<td><a href="http://www.andale.com">http://www.andale.com</a></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Apple Cart</td>
<td><a href="http://www.spads.com">http://www.spads.com</a></td>
<td>Seems too low level for my needs</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>ASecureCart</td>
<td></td>
<td></td>
<td>x</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>B2I_Shopping_Cart</td>
<td><a href="http://www.b2ishoppingcart.com">http://www.b2ishoppingcart.com</a></td>
<td>Looks like a one-person company</td>
<td>x</td>
<td>x</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Cart Manager</td>
<td><a href="http://www.cartmanager.net/">http://www.cartmanager.net/</a></td>
<td></td>
<td>x</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>CartFusion</td>
<td><a href="http://www.tradestudios.com/">http://www.tradestudios.com/</a></td>
<td>Under new management and confusing</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>CashCowCart</td>
<td><a href="http://www.cashcowcart.com">http://www.cashcowcart.com</a></td>
<td>Could use polish</td>
<td>x</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>CatalogIntegrator Cart</td>
<td><a href="http://www.CatalogIntegrator.com">http://www.CatalogIntegrator.com</a></td>
<td>Shell site; could use polish</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>cf_ezcart ColdFusion Shopping<br />
Cart</td>
<td><a href="http://www.cf-ezcart.com/">http://www.cf-ezcart.com/</a></td>
<td>Requires ColdFusion</td>
<td></td>
<td>x</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Colehosting.com</td>
<td><a href="http://www.colehosting.com">http://www.colehosting.com</a></td>
<td>Smallish design/hosting provider</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Comersus ASP Shopping Cart<br />
&amp; Mall</td>
<td><a href="http://www.comersus.com">http://www.comersus.com</a></td>
<td>Could use polish</td>
<td></td>
<td>x</td>
<td></td>
<td></td>
<td>$299 for PowerPack (free<br />
version doesn&#8217;t do enough)</td>
</tr>
<tr>
<td>CoreAve Web Design &amp; Web<br />
Site Hosting</td>
<td><a href="http://coreave.com">http://coreave.com</a></td>
<td>One man shop</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>CyberOffice Shopping Cart</td>
<td><a href="http://www.smartwin.com.au/cybershop.htm">http://www.smartwin.com.au/cybershop.htm</a></td>
<td>Could use polish</td>
<td></td>
<td>X</td>
<td>ASP</td>
<td>ODBC</td>
<td></td>
</tr>
<tr>
<td>DesignCart</td>
<td><a href="http://www.designcart.com">http://www.designcart.com</a></td>
<td></td>
<td>x</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Earth Skater Custom eCommerce</td>
<td><a href="http://www.earthskater.net">http://www.earthskater.net</a></td>
<td></td>
<td>x</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>EasyCart</td>
<td><a href="http://www.easycart.com">http://www.easycart.com</a></td>
<td>Too canned for my needs</td>
<td>x</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>EasyStoreCreator</td>
<td><a href="http://www.easystorecreator.com">http://www.easystorecreator.com</a></td>
<td>Too canned for my needs</td>
<td>x</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Ecommerce Shopping Cart</td>
<td><a href="http://www.roicart.com">http://www.roicart.com</a></td>
<td></td>
<td>x</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Ecommerce Templates</td>
<td><a href="http://www.ecommercetemplates.com">http://www.ecommercetemplates.com</a></td>
<td>Seems a bit simple</td>
<td></td>
<td>x</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>eCOMpal</td>
<td><a href="http://www.ecompal.com">http://www.ecompal.com</a></td>
<td></td>
<td>x</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Ecompro</td>
<td><a href="http://ecompro.com/content.cfm/shoppingcart">http://ecompro.com/content.cfm/shoppingcart</a></td>
<td></td>
<td>x</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>e-Merchanizer</td>
<td><a href="http://www.lynchinteractive.com">http://www.lynchinteractive.com</a></td>
<td>For smaller businesses; Typo? C&#8217;mon.</td>
<td>x</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Evocative Commerce</td>
<td><a href="http://www.evocative.com">http://www.evocative.com</a></td>
<td>Hosting provider</td>
<td>x</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>FORT eCommerce</td>
<td><a href="http://www.fortsystem.com">http://www.fortsystem.com</a></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Fractal Commerce</td>
<td><a href="http://www.rvbs.com/index_en.html">http://www.rvbs.com/index_en.html</a></td>
<td>404; can&#8217;t find site</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Free AFCommerce Shopping Cart</td>
<td><a href="http://www.afcommerce.com">http://www.afcommerce.com</a></td>
<td>Could use polish</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Freedom Networking Solutions</td>
<td><a href="http://www.freedomnetworking.com">http://www.freedomnetworking.com</a></td>
<td></td>
<td>x</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>GoECart</td>
<td><a href="http://www.goecart.com">http://www.goecart.com</a></td>
<td></td>
<td>x</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>GoldbarOne</td>
<td><a href="http://www.goldbar.net">http://www.goldbar.net</a></td>
<td></td>
<td>x</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>InOrder</td>
<td><a href="http://www.morsedata.com">http://www.morsedata.com</a></td>
<td>Basically an ERP for the SMB market, which can<br />
include an ecommerce module; Company is Morse Data; HQ in Dover, NH</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Internet Commerce Engine 5</td>
<td><a href="http://www.ice5software.com">http://www.ice5software.com</a></td>
<td></td>
<td></td>
<td>x</td>
<td></td>
<td></td>
<td>$3,995 for Small Business<br />
Edition (!!)</td>
</tr>
<tr>
<td>iSell Shopping Cart</td>
<td><a href="http://www.macdock.com/mac/webhosting/ecommerce/isell.php">http://www.macdock.com/mac/webhosting/ecommerce/isell.php</a></td>
<td>404</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>King Cart Services</td>
<td><a href="http://www.king-cart.com">http://www.king-cart.com</a></td>
<td></td>
<td>x</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Make-a-Store</td>
<td><a href="http://www.make-a-store.com">http://www.make-a-store.com</a></td>
<td></td>
<td></td>
<td>x</td>
<td></td>
<td></td>
<td>Heavy Metal starts at $2,995</td>
</tr>
<tr>
<td>MalÕs E-commerce</td>
<td><a href="http://www.mals-e.com">http://www.mals-e.com</a></td>
<td></td>
<td>x</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>MightyMerchant</td>
<td><a href="http://www.mightymerchant.com">http://www.mightymerchant.com</a></td>
<td></td>
<td>x</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>MIVA Merchant</td>
<td><a href="http://smallbusiness.miva.com/products/merchant">http://smallbusiness.miva.com/products/merchant</a></td>
<td>Software, but written in proprietary MivaScript</td>
<td></td>
<td>x</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>MonsterCommerce Pro E-commerce</td>
<td><a href="http://www.networksolutions.com/e-commerce/ecommerce-pro-package.jsp">http://www.networksolutions.com/e-commerce/ecommerce-pro-package.jsp</a></td>
<td>Hosted by Network Solutions</td>
<td>x</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>MyCart.net</td>
<td><a href="http://www.MyCart.net">http://www.MyCart.net</a></td>
<td></td>
<td>x</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>MyWebSiteTool</td>
<td><a href="http://www.mywebsitetool.com">http://www.mywebsitetool.com</a></td>
<td></td>
<td>x</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>NetStores</td>
<td><a href="http://www.netstores.com">http://www.netstores.com</a></td>
<td></td>
<td>x</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Next Gen Cart</td>
<td><a href="http://www.weaveyourwebdreams.com">http://www.weaveyourwebdreams.com</a></td>
<td>Could use polish</td>
<td></td>
<td>x</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>PDG Shopping Cart</td>
<td><a href="http://www.pdgsoft.com">http://www.pdgsoft.com</a></td>
<td>Something about this doesn&#8217;t inspire confidence</td>
<td></td>
<td>x</td>
<td></td>
<td></td>
<td>PDG Commerce ranges from $999<br />
to $1,799</td>
</tr>
<tr>
<td>PepperCart</td>
<td><a href="http://peppercart.com">http://peppercart.com</a></td>
<td>Whaaaa???</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Pinnacle Cart</td>
<td><a href="http://www.pinnaclecart.com">http://www.pinnaclecart.com</a></td>
<td>Not seeing anything compelling</td>
<td>x</td>
<td>x</td>
<td>PHP, Apache</td>
<td>MySQL</td>
<td>$597; $697 for developer<br />
license (includes source code)</td>
</tr>
<tr>
<td>POWERSTOREASP</td>
<td><a href="http://www.powerstoreasp.com">http://www.powerstoreasp.com</a></td>
<td>404</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Priusant</td>
<td><a href="http://www.priusant.com/products_sc.htm">http://www.priusant.com/products_sc.htm</a></td>
<td>404; no ecommerce products on site</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>ProductCart</td>
<td><a href="http://www.earlyimpact.com">http://www.earlyimpact.com</a></td>
<td>Others seem better</td>
<td></td>
<td>x</td>
<td></td>
<td></td>
<td>$695</td>
</tr>
<tr>
<td>ProStores</td>
<td><a href="http://www.prostores.com">www.prostores.com</a></td>
<td>Feature comparison at http://www.prostores.com/shopping_cart_features.html</td>
<td>x</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Quick Cart</td>
<td><a href="http://www.quickcart.com">http://www.quickcart.com</a></td>
<td></td>
<td>x</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>QuickEStore</td>
<td><a href="http://www.quickestore.com">http://www.quickestore.com</a></td>
<td>Template-based; could be nicer looking</td>
<td></td>
<td>x</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Ruby Business Platform</td>
<td><a href="http://www.rubensteintech.com/ruby">http://www.rubensteintech.com/ruby</a></td>
<td>Not enough info to tell</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>SalesCart</td>
<td><a href="http://www.SalesCart.com">http://www.SalesCart.com</a></td>
<td></td>
<td></td>
<td>x</td>
<td>ASP.NET</td>
<td></td>
<td>$499.99</td>
</tr>
<tr>
<td>SCartFree SCartServer Online<br />
Shopping Cart Network</td>
<td><a href="http://shopping.scartserver.com">http://shopping.scartserver.com</a></td>
<td>Ad-sponsored</td>
<td>x</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>SecureNetShop</td>
<td><a href="http://www.securenetshop.com">http://www.securenetshop.com</a></td>
<td></td>
<td>x</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>SEO-Cart</td>
<td><a href="http://www.seo-cart.com">http://www.seo-cart.com</a></td>
<td></td>
<td>x</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>ShopFactory</td>
<td><a href="http://www.shopfactory.com">http://www.shopfactory.com</a></td>
<td>Unclear; too hard to find info</td>
<td></td>
<td>x</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Shop-Script</td>
<td><a href="http://www.shop-script.com">http://www.shop-script.com</a></td>
<td>Could use polish</td>
<td></td>
<td>x</td>
<td>PHP</td>
<td></td>
<td></td>
</tr>
<tr>
<td>ShopSite</td>
<td><a href="http://www.shopsite.com">http://www.shopsite.com</a></td>
<td>Mostly Hosted; can get Software but expensive;<br />
AviaDirect store uses it</td>
<td>x</td>
<td>x</td>
<td></td>
<td></td>
<td>Manager $690/Pro $1490</td>
</tr>
<tr>
<td>SmartCart</td>
<td><a href="http://www.smartcart.com">http://www.smartcart.com</a></td>
<td></td>
<td>x</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>StoreFront</td>
<td><a href="http://www.storefront.net">http://www.storefront.net</a></td>
<td>To get source, need the XE version</td>
<td>x</td>
<td>x</td>
<td></td>
<td></td>
<td>XE is $3,295; the AE version is<br />
$1,995</td>
</tr>
<tr>
<td>SunShop Shopping Cart</td>
<td><a href="http://www.turnkeywebtools.com">http://www.turnkeywebtools.com</a></td>
<td></td>
<td></td>
<td>x</td>
<td></td>
<td></td>
<td>$549.99 for an &#8220;owned&#8221; license</td>
</tr>
<tr>
<td>UltraCart</td>
<td><a href="http://www.ultracart.com">http://www.ultracart.com</a></td>
<td></td>
<td>x</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Veracart</td>
<td><a href="http://www.veracart.com">http://www.veracart.com</a></td>
<td></td>
<td>x</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Virtualshop</td>
<td><a href="http://www.virtualshop.co.uk">http://www.virtualshop.co.uk</a></td>
<td>Doesn&#8217;t seem industrial strength</td>
<td></td>
<td>x</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>VirtualStore 2000</td>
<td><a href="http://www.vs2000.net">http://www.vs2000.net</a></td>
<td>OMG – they have a Y2K banner on their home page</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Volusion</td>
<td><a href="http://www.volusion.com">http://www.volusion.com</a></td>
<td></td>
<td>x</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Zoovy e-Commerce</td>
<td><a href="http://www.zoovy.com">http://www.zoovy.com</a></td>
<td>Seems comprehensive</td>
<td>x</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/psterpe.wordpress.com/89/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/psterpe.wordpress.com/89/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/psterpe.wordpress.com/89/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/psterpe.wordpress.com/89/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/psterpe.wordpress.com/89/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/psterpe.wordpress.com/89/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/psterpe.wordpress.com/89/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/psterpe.wordpress.com/89/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/psterpe.wordpress.com/89/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/psterpe.wordpress.com/89/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/psterpe.wordpress.com/89/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/psterpe.wordpress.com/89/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/psterpe.wordpress.com/89/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/psterpe.wordpress.com/89/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=psterpe.wordpress.com&amp;blog=6846254&amp;post=89&amp;subd=psterpe&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://psterpe.wordpress.com/2009/05/14/lite-survey-of-ecommerce-platforms/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/045720d31ca7bbf213c0496f576ff9a3?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">psterpe</media:title>
		</media:content>
	</item>
		<item>
		<title>Adventures in SharePoint Forms Based Authentication &#8211; Part 4</title>
		<link>http://psterpe.wordpress.com/2009/03/19/adventures-in-sharepoint-forms-based-authentication-part-4/</link>
		<comments>http://psterpe.wordpress.com/2009/03/19/adventures-in-sharepoint-forms-based-authentication-part-4/#comments</comments>
		<pubDate>Thu, 19 Mar 2009 18:22:17 +0000</pubDate>
		<dc:creator>psterpe</dc:creator>
				<category><![CDATA[SharePoint]]></category>
		<category><![CDATA[HowTo]]></category>

		<guid isPermaLink="false">http://psterpe.wordpress.com/?p=69</guid>
		<description><![CDATA[This fourth and last part of my FBA mini-series (here are links to Part 1, Part 2, and Part 3), is about permissions. You&#8217;re using Forms Based Authentication which stores the information about all those &#8220;outsider&#8221; users in SQL Server rather than cluttering your Active Directory. But if these folks are not known to your [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=psterpe.wordpress.com&amp;blog=6846254&amp;post=69&amp;subd=psterpe&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>This fourth and last part of my FBA mini-series (here are links to <a href="http://psterpe.wordpress.com/2009/03/05/adventures-in-sharepoint-forms-based-authentication-part-1/">Part 1</a>, <a href="http://psterpe.wordpress.com/2009/03/06/adventures-in-sharepoint-forms-based-authentication-part-2/">Part 2</a>, and <a href="http://psterpe.wordpress.com/2009/03/10/adventures-in-sharepoint-forms-based-authentication-part-3/">Part 3</a>), is about permissions. You&#8217;re using Forms Based Authentication which stores the information about all those &#8220;outsider&#8221; users in SQL Server rather than cluttering your Active Directory. But if these folks are not known to your environment as Windows users, how can you assign them permissions in SharePoint?</p>
<p>The ASP.NET custom role provider makes this easy. What happens is that any roles you define are visible in SharePoint as users. Since a role shows up as a user, you can add a role to a permission group as if it were a person. How does that help us? When we register our users with the ASP.NET Membership provider, we can also assign each user to the role he/she will play.</p>
<p>For example, I recently worked on a project in which some of the users would be credentialed health care professionals and some would not. To represent those users, we could define two roles: &#8220;Registered &#8211; HCP&#8221; for the health care people (it gets as tiresome to type &#8220;health care professional&#8221; as it does to read it, so I&#8217;ll be abbreviating it HCP from now on) and &#8220;Registered &#8211; General&#8221; for everyone else. When we create an account for an HCP, we assign that user to the &#8220;Registered &#8211; HCP&#8221; role; correspondingly, non-health care pros would be assigned to the &#8220;Registered &#8211; General&#8221; role. Those roles, in turn, we will add to SharePoint permission groups so that, say, HCP users can see certain content that General users cannot.</p>
<p>Here&#8217;s a short cookbook for setting this up.</p>
<ol>
<li>Configure your SharePoint web application to use the Microsoft-provided custom role provider that stores role information in SQL Server. <a href="http://psterpe.wordpress.com/2009/03/17/adventures-in-sharepoint-forms-based-authentication-part-1">Part 1</a> of this series outlines how to create the SQL database that will hold user information. Here&#8217;s what you put in web.config to start using the custom role provider:
<pre class="brush: xml;">
&lt;roleManager enabled=&quot;true&quot; defaultProvider=&quot;PJSAspNetSqlRoleProvider&quot;&gt;
&lt;providers&gt;
&lt;add name=&quot;PJSAspNetSqlRoleProvider&quot;
    type=&quot;System.Web.Security.SqlRoleProvider, System.Web, &amp;#xA; Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a&quot;
    connectionStringName=&quot;PJSSqlConnString&quot;
    applicationName=&quot;/&quot;/&gt;
&lt;/providers&gt;
&lt;/roleManager&gt;
</pre>
<p>Most of this is boilerplate. The parts that aren&#8217;t are the places where you name things. In the &lt;add name=&#8221;"&gt; declaration, supply any name you like for this provider. Make sure to use this same name above in the defaultProvider=&#8221;" declaration. The other name you have to supply is a value for &#8220;connectionStringName&#8221;; this must correspond to the element in the &lt;connectionStrings&gt; section of web.config that describes how to connect to your database server.</p>
<li>From Visual Studio, open the project for the web application you&#8217;re working on and launch the ASP.NET Configuration tool to ensure the custom role provider is in use. You launch the tool from the Website menu; it&#8217;s Website-&gt;ASP.NET Configuration.  The configuration tool is a web application; launching it will either start Internet Explorer for you, or if you already have IE running, it will open a new tab. Select the Provider Configuration link, and on the subsequent page, select the link &#8220;Select a different provider for each feature (advanced).&#8221; You&#8217;ll see a page that looks like the illustration below. Under Role Provider, you should see the name you used in web.config; select your provider. If you want, click the Test link to make sure your connection string is correct and that you can successfully connect to the database.<br />
<div id="attachment_71" class="wp-caption aligncenter" style="width: 410px"><a href="http://psterpe.files.wordpress.com/2009/03/aspnetconfig_provider.png"><img src="http://psterpe.files.wordpress.com/2009/03/aspnetconfig_provider.png?w=400&#038;h=389" alt="Provider configuration in the ASP.NET Configuration tool" title="aspnetconfig_provider" width="400" height="389" class="size-full wp-image-71" /></a><p class="wp-caption-text">Provider configuration in the ASP.NET Configuration tool</p></div></p>
<li>Now go to the Security tab of the configuration tool so you can define roles that correspond to the categories your users will fall into. Using my example, we would define two roles: &#8220;Registered &#8211; HCP&#8221; and &#8220;Registered &#8211; General.&#8221; You do this by selecting the &#8220;Create or Manage roles&#8221; link in the center of the page. The next page you&#8217;ll see is illustrated below. Role creation is simple: type a role name where it says &#8220;New role name:&#8221; and click the Add Role button. This is all you&#8217;ll need to do in the ASP.NET configuration tool.<br />
<div id="attachment_72" class="wp-caption aligncenter" style="width: 520px"><a href="http://psterpe.files.wordpress.com/2009/03/aspnetconfig_security.png"><img src="http://psterpe.files.wordpress.com/2009/03/aspnetconfig_security.png?w=510&#038;h=342" alt="Role creation with the ASP.NET Configuration tool" title="aspnetconfig_security" width="510" height="342" class="size-full wp-image-72" /></a><p class="wp-caption-text">Role creation with the ASP.NET Configuration tool</p></div></p>
<li>Navigate to your SharePoint application and login as an administrative user. Navigate to the site or sub-site containing special content that only the HCP folks should see.
<li>Create a permission group named &#8220;SpecialContent&#8221; and add the &#8220;Registered &#8211; HCP&#8221; role to the group. If you&#8217;re unclear on how to create a permission group, here are the basic steps:
<ul>
<li>From the Site Actions menu, pick Site Settings, and then pick Advanced permissions
<li>From the New menu, pick New group
<li>Fill in a name for the group. In this example, we&#8217;re using the name &#8220;SpecialContent.&#8221; You can accept the defaults for most of the subsequent sections of this page. At the bottom, you will have to choose which level of permisions members of this group can have, e.g., Read, Contribute, etc. Then click the Create button.
</ul>
<li>You will now be on a page labeled &#8220;People and Groups: SpecialContent.&#8221; You&#8217;ll see that the administrative user you&#8217;re logged in as was automatically made a member of the group. Now you want to add the &#8220;Registered &#8211; HCP&#8221; role as a group member. Here&#8217;s what to do:
<ul>
<li>From the New menu, pick Add Users. In the Users/Groups textarea, type in &#8220;Registered &#8211; HCP&#8221; exactly and click the &#8220;Check names&#8221; icon (looks like a little person with a green check mark superimposed). After a few seconds, the text you typed in should become underlined &#8212; your &#8220;user&#8221; was looked up through the role provider and found to be valid.
<li>In the Give Permissions sections, select &#8220;Add users to a SharePoint group&#8221; and pick &#8220;SpecialContent&#8221; from the dropdown.
<li>In the send E-Mail section, be sure to uncheck &#8220;Send welcome e-mail to the new users&#8221; since our user in this case is a role, not a real person.
<li>Click OK
</ul>
<li>Now navigate to the site or sub-site containing the generally available content that all users can see. Following the same steps above, create a permission group &#8220;GeneralContent&#8221;, grant it Read access, and add both roles &#8220;Registered &#8211; General&#8221; and &#8220;Registered &#8211; HCP&#8221; (as if you were adding users) to the group.
</ol>
<p>To test this out, you can use the ASP.NET Configuration tool to create two users and assign them different roles &#8212; one user gets the &#8220;Registered &#8211; HCP&#8221; role and the other gets the &#8220;Registered &#8211; General&#8221; role. Then login as each user and verify that you can see only the content you expect to see.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/psterpe.wordpress.com/69/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/psterpe.wordpress.com/69/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/psterpe.wordpress.com/69/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/psterpe.wordpress.com/69/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/psterpe.wordpress.com/69/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/psterpe.wordpress.com/69/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/psterpe.wordpress.com/69/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/psterpe.wordpress.com/69/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/psterpe.wordpress.com/69/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/psterpe.wordpress.com/69/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/psterpe.wordpress.com/69/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/psterpe.wordpress.com/69/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/psterpe.wordpress.com/69/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/psterpe.wordpress.com/69/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=psterpe.wordpress.com&amp;blog=6846254&amp;post=69&amp;subd=psterpe&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://psterpe.wordpress.com/2009/03/19/adventures-in-sharepoint-forms-based-authentication-part-4/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/045720d31ca7bbf213c0496f576ff9a3?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">psterpe</media:title>
		</media:content>

		<media:content url="http://psterpe.files.wordpress.com/2009/03/aspnetconfig_provider.png" medium="image">
			<media:title type="html">aspnetconfig_provider</media:title>
		</media:content>

		<media:content url="http://psterpe.files.wordpress.com/2009/03/aspnetconfig_security.png" medium="image">
			<media:title type="html">aspnetconfig_security</media:title>
		</media:content>
	</item>
		<item>
		<title>Client-Side Javascript Event Handlers for ASP.NET Controls &#8212; How??</title>
		<link>http://psterpe.wordpress.com/2009/03/17/client-side-javascript-event-handlers-for-aspnet-controls-how/</link>
		<comments>http://psterpe.wordpress.com/2009/03/17/client-side-javascript-event-handlers-for-aspnet-controls-how/#comments</comments>
		<pubDate>Tue, 17 Mar 2009 22:57:31 +0000</pubDate>
		<dc:creator>psterpe</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[HowTo]]></category>

		<guid isPermaLink="false">http://psterpe.wordpress.com/?p=50</guid>
		<description><![CDATA[When developing with ASP.NET server controls such as asp:DropDownList or asp:Textbox that you have declared as runat="server", have you struggled with getting an OnChange or OnBlur event handler to be called? If you just do what you would have done with a plain old &#60;input type="text"&#62; or &#60;select&#62; control, which is to give the control [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=psterpe.wordpress.com&amp;blog=6846254&amp;post=50&amp;subd=psterpe&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>When developing with ASP.NET server controls such as asp:DropDownList or asp:Textbox that you have declared as <code>runat="server"</code>, have you struggled with getting an OnChange or OnBlur event handler to be called? If you just do what you would have done with a plain old <code>&lt;input type="text"&gt;</code> or <code>&lt;select&gt;</code> control, which is to give the control an event attribute like <code>onchange="myHandler()"</code>, you end up sad &#8212; your Javascript event handler never gets called. So how can you get it to be called?</p>
<p>The trick is to assign the event handler to your control <em>programmatically</em>. Here&#8217;s an example of doing this in C# as part of the page load event:</p>
<p><code></p>
<pre>
&lt;script runat="server"&gt;

    void Page_Load(object sender, EventArgs e)
    {
        // Find the control we care about.
        DropDownList ddlist = (DropDownList)FindControl("id_of_dropdown");

        // Give the control our script as an event handler. Note that you
        // don't have to pass a reference to "this" as an argument; if you
        // don't need it, omit it.
        ddlist.Attributes.Add("onchange", "OnChangeHandler(this)");
    }
&lt;/script&gt;

&lt;!-- Page content goes here. --&gt;

&lt;script&gt;

    // This is the implementation of our event handling
    // script that was referenced above.

    function OnChangeHandler(obj)
    {
        // Javascript implementation of event handler goes here.
    }

    &lt;!-- Other event handler scripts could go here --&gt;

&lt;/script&gt;

&lt;!-- HTML for page goes here --&gt;
</pre>
<p></code></p>
<p>In this example, I used the FindControl() method to find the control by id, and then I added my event handler script as an attribute. Although I passed &#8220;this&#8221; as an argument to my handler, that isn&#8217;t required. It was useful for my implementation because I used the same handler for more than one control. If you want no arguments, include the parentheses with nothing between them. Note that the handler is defined in a<code>&lt;script&gt;</code> tag that <em>does not</em> say <code>runat="server"</code> &#8212; you want this script to run on the client once your control&#8217;s OnChange event fires due to user interaction.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/psterpe.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/psterpe.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/psterpe.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/psterpe.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/psterpe.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/psterpe.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/psterpe.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/psterpe.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/psterpe.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/psterpe.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/psterpe.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/psterpe.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/psterpe.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/psterpe.wordpress.com/50/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=psterpe.wordpress.com&amp;blog=6846254&amp;post=50&amp;subd=psterpe&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://psterpe.wordpress.com/2009/03/17/client-side-javascript-event-handlers-for-aspnet-controls-how/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/045720d31ca7bbf213c0496f576ff9a3?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">psterpe</media:title>
		</media:content>
	</item>
		<item>
		<title>Adventures in SharePoint Forms Based Authentication &#8211; Part 3</title>
		<link>http://psterpe.wordpress.com/2009/03/10/adventures-in-sharepoint-forms-based-authentication-part-3/</link>
		<comments>http://psterpe.wordpress.com/2009/03/10/adventures-in-sharepoint-forms-based-authentication-part-3/#comments</comments>
		<pubDate>Wed, 11 Mar 2009 03:23:46 +0000</pubDate>
		<dc:creator>psterpe</dc:creator>
				<category><![CDATA[SharePoint]]></category>
		<category><![CDATA[HowTo]]></category>

		<guid isPermaLink="false">http://psterpe.wordpress.com/?p=29</guid>
		<description><![CDATA[Part 1 and Part 2 of this series on Forms Based Authentication in SharePoint began painting a mental picture of how FBA works. What might not be clear is how the user gets presented with a form for logging in. Here are a few words (and a couple of pictures) on that. When you hit [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=psterpe.wordpress.com&amp;blog=6846254&amp;post=29&amp;subd=psterpe&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://psterpe.wordpress.com/2009/03/05/adventures-in-sharepoint-forms-based-authentication-part-1/">Part 1</a> and <a href="http://psterpe.wordpress.com/2009/03/06/adventures-in-sharepoint-forms-based-authentication-part-2/">Part 2</a> of this series on Forms Based Authentication in SharePoint began painting a mental picture of how FBA works. What might not be clear is how the user gets presented with a form for logging in. Here are a few words (and a couple of pictures) on that.</p>
<p>When you hit the landing page of a SharePoint site that is using FBA, you see a &#8220;Sign In&#8221; link in the upper right corner: <div id="attachment_31" class="wp-caption aligncenter" style="width: 310px"><a href="http://psterpe.files.wordpress.com/2009/03/20090310_signinlink.png"><img src="http://psterpe.files.wordpress.com/2009/03/20090310_signinlink.png?w=103&#038;h=18" alt="Sign In link on FBA-enabled SharePoint application" title="20090310_signinlink" width="103" height="18" class="size-full wp-image-31" /></a><p class="wp-caption-text">Sign In link on FBA-enabled SharePoint application</p></div>This link takes you to an HTML form &#8212; the &#8220;F&#8221; in &#8220;FBA&#8221; &#8212; where you&#8217;ll enter your login credentials. You don&#8217;t have to edit any pages to cause this link to appear; you get it for free once you have done all the steps to configure your web application for FBA. (There are <em>lots</em> of configuration steps, though, so &#8220;for free&#8221; is debatable.)</p>
<p>So what about the form where you enter your credentials? Do you have to create it? No, you don&#8217;t. SharePoint comes out of the box with a login form, named login.aspx, which is located in the _layouts folder of your installation. (The full path to _layouts is <code>C:\Program Files\Common Files\Microsoft Shared\Web Server Extension\12\template\layouts</code>.) The provided form is, understandably, simple: <div id="attachment_32" class="wp-caption aligncenter" style="width: 520px"><a href="http://psterpe.files.wordpress.com/2009/03/20090310_signinscreen.png"><img src="http://psterpe.files.wordpress.com/2009/03/20090310_signinscreen.png?w=510&#038;h=147" alt="Basic login screen included with SharePoint" title="20090310_signinscreen" width="510" height="147" class="size-full wp-image-32" /></a><p class="wp-caption-text">Basic login screen included with SharePoint</p></div></p>
<p>Although you don&#8217;t have to create your own, you will probably want to. If you do create your own login form, what&#8217;s the magic that causes the &#8220;Sign In&#8221; link to display your form instead of SharePoint&#8217;s form? That happens in web.config, your application&#8217;s configuration file. Here&#8217;s the relevant section:<br />
<code><br />
&lt;authentication mode="Forms"&gt;<br />
    &lt;forms loginUrl="/_layouts/login.aspx"/&gt;<br />
&lt;/authentication&gt;<br />
</code></p>
<p>If you create your own login form, name it something other than login.aspx, put it in the _layouts folder, and edit this config entry to point to your file. Don&#8217;t edit the login.aspx in _layouts no matter how simple your change may be. A mistake in that file will affect all applications sharing this installation of SharePoint.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/psterpe.wordpress.com/29/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/psterpe.wordpress.com/29/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/psterpe.wordpress.com/29/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/psterpe.wordpress.com/29/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/psterpe.wordpress.com/29/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/psterpe.wordpress.com/29/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/psterpe.wordpress.com/29/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/psterpe.wordpress.com/29/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/psterpe.wordpress.com/29/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/psterpe.wordpress.com/29/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/psterpe.wordpress.com/29/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/psterpe.wordpress.com/29/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/psterpe.wordpress.com/29/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/psterpe.wordpress.com/29/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=psterpe.wordpress.com&amp;blog=6846254&amp;post=29&amp;subd=psterpe&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://psterpe.wordpress.com/2009/03/10/adventures-in-sharepoint-forms-based-authentication-part-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/045720d31ca7bbf213c0496f576ff9a3?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">psterpe</media:title>
		</media:content>

		<media:content url="http://psterpe.files.wordpress.com/2009/03/20090310_signinlink.png" medium="image">
			<media:title type="html">20090310_signinlink</media:title>
		</media:content>

		<media:content url="http://psterpe.files.wordpress.com/2009/03/20090310_signinscreen.png" medium="image">
			<media:title type="html">20090310_signinscreen</media:title>
		</media:content>
	</item>
	</channel>
</rss>
