<?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>Alan&#039;s Blog</title>
	<atom:link href="http://anlai.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://anlai.wordpress.com</link>
	<description>Things I come up with chained to my desk</description>
	<lastBuildDate>Sat, 04 Feb 2012 06:37:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='anlai.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Alan&#039;s Blog</title>
		<link>http://anlai.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://anlai.wordpress.com/osd.xml" title="Alan&#039;s Blog" />
	<atom:link rel='hub' href='http://anlai.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Exchange Calendar Syncing with Exchange Web Services (EWS) API</title>
		<link>http://anlai.wordpress.com/2011/06/22/exchange-calendar-syncing-with-exchange-web-services-ews-api/</link>
		<comments>http://anlai.wordpress.com/2011/06/22/exchange-calendar-syncing-with-exchange-web-services-ews-api/#comments</comments>
		<pubDate>Wed, 22 Jun 2011 19:49:58 +0000</pubDate>
		<dc:creator>anlai</dc:creator>
				<category><![CDATA[Asp.net]]></category>
		<category><![CDATA[Exchange Web Services EWS]]></category>

		<guid isPermaLink="false">https://anlai.wordpress.com/?p=126</guid>
		<description><![CDATA[I’ve been working with the Exchange Web Services managed API on and off for the past year and surprisingly there isn’t all that much documentation.  Sure there is the standard Microsoft documentation (here) but it only gives basic examples.  Which as it turns out worked out for the majority of the functions I need to [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=anlai.wordpress.com&amp;blog=12134941&amp;post=126&amp;subd=anlai&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I’ve been working with the Exchange Web Services managed API on and off for the past year and surprisingly there isn’t all that much documentation.  Sure there is the standard Microsoft documentation (<a href="http://msdn.microsoft.com/en-us/library/dd633710(v=EXCHG.80).aspx">here</a>) but it only gives basic examples.  Which as it turns out worked out for the majority of the functions I need to handle for my project, but there is one problem that the API couldn’t handle.</p>
<p>The project that I’ve been working on is an appointment scheduling application.  The basics are that the application maintains a master calendar of a various number of people and they each specify when they are available for appointments and for what type of appointment.  These appointments are displayed in the program but are also written out to their exchange calendars.  Keeping these appointments in order would be all fine and dandy except the appointment aren’t read-only.</p>
<p>EWS does have a function that will supposedly aid in synchronizing the calendar to the database.  The function called “SyncFolderItems” takes a sync state (which it returns to you when you run the function) and using this sync state information EWS returns any changes to the calendar since that sync.  However it doesn’t seem to work all that well and appears to be quite fragile (it is probably worth noting that I am working against an Exchange 2007sp1 server and not 2010).  The sync might work at first but after some amount of time or some condition it just stops returning any changes at all.  And it’s hard to debug since EWS just tells me no changes happened.</p>
<p>This is the MyAppointment class that is used in the program.</p>
<div id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:c33561c6-7629-41a8-82dd-4b5accef7262" class="wlWriterEditableSmartContent" style="display:inline;float:none;margin:0;padding:0;"><pre class="brush: csharp;">
public class MyAppointment
{
    public int Id { get; set; }
    public DateTime Start { get; set; }
    public DateTime End { get; set; }
    public string Subject { get; set; }
    public string Body { get; set; }

    public string ExchangeId { get; set; }
}
</pre></p>
</div>
<p>The following is the code for using the EWS sync function.</p>
<div id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:f7dca313-b509-4792-8c23-e3802a3f2689" class="wlWriterEditableSmartContent" style="display:inline;float:none;margin:0;padding:0;"><pre class="brush: csharp; wrap-lines: true;">
public string SyncChanges(string mailboxId, IEnumerable&lt;MyAppointment&gt; appointments, string syncState)
{
    var service = InitializeService(mailboxId);

    var changeLog = service.SyncFolderItems(
        new FolderId(WellKnownFolderName.Calendar, mailboxId),
        PropertySet.FirstClassProperties, null, 512,
        SyncFolderItemsScope.NormalItems, syncState);

    foreach (var changedItem in changeLog)
    {
        var appt = appointments.Where(a =&gt; a.ExchangeId == changedItem.ItemId.UniqueId).FirstOrDefault();

        if (appt != null)
        {
            switch(changedItem.ChangeType)
            {
                case ChangeType.Update:
                    var appointment = (Appointment) changedItem.Item;
                    appointment.Start = appt.Start;
                    appointment.End = appt.End;
                    appointment.Subject = appt.Subject;
                    appointment.Body = appt.Body;

                    // write the change back to exchange

                    break;
                case ChangeType.Delete:

                    var newAppointment = new Appointment(service);

                    newAppointment.Start = appt.Start;
                    newAppointment.End = appt.End;
                    newAppointment.Subject = appt.Subject;
                    newAppointment.Body = appt.Body;

                    // write the change back to exchange

                    break;
                default:
                    break;
            }
        }
    }

    return changeLog.SyncState;
}
</pre></p>
</div>
<p>However the above code doesn’t work for whatever reason.  Instead I wrote the following function that essentially does the same thing, but only syncs data 2 months ahead.  It takes a few more lines of code but using Linq it makes it easy to do the comparisons.</p>
<div id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:41149411-865b-4719-8406-7567a2c30fb7" class="wlWriterEditableSmartContent" style="display:inline;float:none;margin:0;padding:0;"><pre class="brush: csharp;">
public void SyncChanges(string mailboxId, IEnumerable&lt;MyAppointment&gt; myAppointments)
{
    // get appt one day before and 1 month out
    var searchFilter = new SearchFilter.SearchFilterCollection(LogicalOperator.And);
    searchFilter.Add(
        new SearchFilter.IsGreaterThanOrEqualTo(AppointmentSchema.Start, DateTime.Now.AddDays(-1)));
    searchFilter.Add(
        new SearchFilter.IsLessThanOrEqualTo(AppointmentSchema.End, DateTime.Now.AddMonths(2)));
    searchFilter.Add(
        new SearchFilter.IsEqualTo(ItemSchema.ItemClass, &quot;IPM.Appointment&quot;));
    // get back 512 results max
    var view = new ItemView(512);
    // make the remote call
    var service = InitializeService(mailboxId);
    var results = service.FindItems(
        new FolderId(WellKnownFolderName.Calendar, mailboxId), searchFilter, view);

    // get the distinct ids from exchange
    var exchangeIds = results.Select(a =&gt; a.Id.UniqueId);

    // get the distinct ones we have
    var dbIds = myAppointments.Select(a =&gt; a.ExchangeId);

    // find the ids that are in the db but not in exchange
    var missing = dbIds.Where(a =&gt; !exchangeIds.Contains(a));

    var newAppts = myAppointments.Where(a =&gt; missing.Contains(a.ExchangeId)).Select(
                        a =&gt; new Appointment(service) {Start = a.Start
                                                     , End = a.End
                                                     , Subject = a.Subject
                                                     , Body = a.Body});

    // get the exchange objects we do have in the db
    var appts = results.Where(a =&gt; !missing.Contains(a.Id.UniqueId) &amp;&amp; dbIds.Contains(a.Id.UniqueId))
                       .Select(a =&gt; (Appointment)a);

    var changedAppts = new List();

    // find the changed appointments
    foreach (var appointment in appts)
    {
        // get the db appointment object
        var appt = myAppointments.Where(a =&gt; a.ExchangeId == appointment.Id.UniqueId).FirstOrDefault();

        // compare the time stamps and determine if we need to make a change
        if (appt != null)
        {
            if (appt.Start != appointment.Start || appt.End != appointment.End)
            {
                // make the changes
                appointment.Start = appt.Start;
                appointment.End = appt.End;
                appointment.Subject = appt.Subject;
                appointment.Body = appt.Body;

                // add it to the list of ones needed to change
                changedAppts.Add((Item)appointment);
            }
        }
    }

    // write the new and updated objects to exchange
}
</pre></p>
</div>
<p>The end result is that if a user moves or deletes an appointment managed by the program it can on interval go back and sync the calendar.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/anlai.wordpress.com/126/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/anlai.wordpress.com/126/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/anlai.wordpress.com/126/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/anlai.wordpress.com/126/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/anlai.wordpress.com/126/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/anlai.wordpress.com/126/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/anlai.wordpress.com/126/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/anlai.wordpress.com/126/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/anlai.wordpress.com/126/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/anlai.wordpress.com/126/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/anlai.wordpress.com/126/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/anlai.wordpress.com/126/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/anlai.wordpress.com/126/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/anlai.wordpress.com/126/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=anlai.wordpress.com&amp;blog=12134941&amp;post=126&amp;subd=anlai&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://anlai.wordpress.com/2011/06/22/exchange-calendar-syncing-with-exchange-web-services-ews-api/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2fba155f9b45f2372dfcea40849c68a6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">anlai</media:title>
		</media:content>
	</item>
		<item>
		<title>Talk on Common Web Vulnerabilities</title>
		<link>http://anlai.wordpress.com/2011/06/17/talk-on-common-web-vulnerabilities/</link>
		<comments>http://anlai.wordpress.com/2011/06/17/talk-on-common-web-vulnerabilities/#comments</comments>
		<pubDate>Fri, 17 Jun 2011 17:03:29 +0000</pubDate>
		<dc:creator>anlai</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">https://anlai.wordpress.com/2011/06/17/talk-on-common-web-vulnerabilities/</guid>
		<description><![CDATA[I recently gave a talk on common web vulnerabilities with my colleague Scott Kirkland (see a link to his blog on the right) at the 2011 IT Security Symposium at UC Davis.  If you attended the session, hope you enjoyed it!  Otherwise we’ve posted the demo and the slide deck on Github. We covered topics [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=anlai.wordpress.com&amp;blog=12134941&amp;post=123&amp;subd=anlai&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I recently gave a talk on common web vulnerabilities with my colleague Scott Kirkland (see a link to his blog on the right) at the 2011 IT Security Symposium at UC Davis.  If you attended the session, hope you enjoyed it!  Otherwise we’ve posted the demo and the slide deck on Github.</p>
<p>We covered topics such as SSL, SQL Encryption, Cross Site Scripting (XSS), Cookie Policies, Html Encoding, Cross Site Request Forgery (CSRF) and Insecure Direct Object Reference.</p>
<p>The demo is also bundled with Scott’s talk on Data Validation and Html5.</p>
<p>You can find the demo and slides <a href="https://github.com/srkirkland/itsecuritysymposium">here</a>.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/anlai.wordpress.com/123/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/anlai.wordpress.com/123/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/anlai.wordpress.com/123/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/anlai.wordpress.com/123/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/anlai.wordpress.com/123/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/anlai.wordpress.com/123/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/anlai.wordpress.com/123/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/anlai.wordpress.com/123/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/anlai.wordpress.com/123/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/anlai.wordpress.com/123/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/anlai.wordpress.com/123/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/anlai.wordpress.com/123/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/anlai.wordpress.com/123/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/anlai.wordpress.com/123/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=anlai.wordpress.com&amp;blog=12134941&amp;post=123&amp;subd=anlai&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://anlai.wordpress.com/2011/06/17/talk-on-common-web-vulnerabilities/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2fba155f9b45f2372dfcea40849c68a6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">anlai</media:title>
		</media:content>
	</item>
		<item>
		<title>Bing Maps jQuery UI Widget</title>
		<link>http://anlai.wordpress.com/2011/01/13/bing-maps-jquery-ui-widget/</link>
		<comments>http://anlai.wordpress.com/2011/01/13/bing-maps-jquery-ui-widget/#comments</comments>
		<pubDate>Thu, 13 Jan 2011 19:17:56 +0000</pubDate>
		<dc:creator>anlai</dc:creator>
				<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">https://anlai.wordpress.com/2011/01/13/bing-maps-jquery-ui-widget/</guid>
		<description><![CDATA[Recently I was working on a project that required the usage of a maps service.  I needed a map that could add pins dynamically (one to many) and have the ability to do routing between two of the pins.  So the obvious choices were Google Maps and Bing Maps.  I opted to use Bing Maps [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=anlai.wordpress.com&amp;blog=12134941&amp;post=118&amp;subd=anlai&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Recently I was working on a project that required the usage of a maps service.  I needed a map that could add pins dynamically (one to many) and have the ability to do routing between two of the pins.  So the obvious choices were Google Maps and Bing Maps.  I opted to use Bing Maps because of the routing abilities for the specific area I needed it to route (a college campus).  Google maps has walking routing but for some reason it didn’t support walking paths on the campus.</p>
<p>My requirements were that it would be easily reusable, easy to setup on the page with one to many pins and that I could turn on and off features with a quick parameter change.  If you would like to see a demo please go <a href="http://anlai.github.com/jqueryUIBingMaps/bingmapsUI.html">here</a>.  This plugin essentially wraps around a small portion of the Bing Maps API, but it’s the portion that was required for my needs.</p>
<h3>Html</h3>
<p>The Html is simple div container to house the map and another div container to house the coordinates.  The coordinates are stored inside a dl.  It’s not exactly compliant with standards have invalid attributes, however it’s on the list to use the data attribute that is compatible with jQuery 1.4.3.  But for now this works.  The information for the pins (names/descriptions) are stored in dt and dd tags.</p>
<pre class="csharpcode"><span class="kwrd">&lt;</span><span class="html">div</span> <span class="attr">id</span><span class="kwrd">="map"</span> <span class="attr">style</span><span class="kwrd">="margin: 0px 0px 20px"</span><span class="kwrd">&gt;</span>
     <span class="kwrd">&lt;</span><span class="html">div</span><span class="kwrd">&gt;</span>
          <span class="kwrd">&lt;</span><span class="html">dl</span><span class="kwrd">&gt;</span>
               <span class="kwrd">&lt;</span><span class="html">div</span> <span class="attr">class</span><span class="kwrd">=""</span> <span class="attr">lat</span><span class="kwrd">="38.53701730537018"</span> <span class="attr">lng</span><span class="kwrd">="-121.7490667104721"</span><span class="kwrd">&gt;</span>
                    <span class="kwrd">&lt;</span><span class="html">dt</span> <span class="kwrd">&gt;</span>Mrak Hall<span class="kwrd">&lt;/</span><span class="html">dt</span><span class="kwrd">&gt;</span>
                    <span class="kwrd">&lt;</span><span class="html">dd</span><span class="kwrd">&gt;</span>Home of AG Dean's Office<span class="kwrd">&lt;/</span><span class="html">dd</span><span class="kwrd">&gt;</span>
               <span class="kwrd">&lt;/</span><span class="html">div</span><span class="kwrd">&gt;</span>
               <span class="kwrd">&lt;</span><span class="html">div</span> <span class="attr">class</span><span class="kwrd">=""</span> <span class="attr">lat</span><span class="kwrd">="38.539411128558385"</span> <span class="attr">lng</span><span class="kwrd">="-121.74984186887741"</span><span class="kwrd">&gt;</span>
                    <span class="kwrd">&lt;</span><span class="html">dt</span> <span class="kwrd">&gt;</span>Shields Library<span class="kwrd">&lt;/</span><span class="html">dt</span><span class="kwrd">&gt;</span>
                    <span class="kwrd">&lt;</span><span class="html">dd</span><span class="kwrd">&gt;</span>The Main Library of Davis<span class="kwrd">&lt;/</span><span class="html">dd</span><span class="kwrd">&gt;</span>
               <span class="kwrd">&lt;/</span><span class="html">div</span><span class="kwrd">&gt;</span>
          <span class="kwrd">&lt;/</span><span class="html">dl</span><span class="kwrd">&gt;</span>
     <span class="kwrd">&lt;/</span><span class="html">div</span><span class="kwrd">&gt;</span> <span class="rem">&lt;!-- End of coordinate container --&gt;</span>
<span class="kwrd">&lt;/</span><span class="html">div</span><span class="kwrd">&gt;</span> <span class="rem">&lt;!-- End of map container –&gt;</span></pre>
<h3>Javascript</h3>
<p>The script couldn’t be more simple.  Below is a basic call to initialize a map in a map container with an id of “map” and seta height of 400px.</p>
<pre class="csharpcode">$(<span class="kwrd">function</span>(){
     $(<span class="str">"#map"</span>).bingmaps({height: <span class="str">"400px"</span>});
});</pre>
<h3>Parameters</h3>
<p>There are several parameters that can be passed into the plugin:</p>
<table border="0" cellspacing="0" cellpadding="2" width="592">
<tbody>
<tr>
<td width="200" valign="top"><strong>Parameter</strong></td>
<td width="390" valign="top"><strong>Description</strong></td>
</tr>
<tr>
<td width="200" valign="top">height</td>
<td width="390" valign="top">height of the map box</td>
</tr>
<tr>
<td width="200" valign="top">width</td>
<td width="390" valign="top">width of the map box</td>
</tr>
<tr>
<td width="200" valign="top">defaultLat</td>
<td width="390" valign="top">default latitude location on load (float)</td>
</tr>
<tr>
<td width="200" valign="top">defaultLng</td>
<td width="390" valign="top">default longitude location on load (float)</td>
</tr>
<tr>
<td width="200" valign="top">defaultZoom</td>
<td width="390" valign="top">default zoom level (int)</td>
</tr>
<tr>
<td width="200" valign="top">defaultMapStyle</td>
<td width="390" valign="top">default map style (VEMapStyle)</td>
</tr>
<tr>
<td width="200" valign="top">enableRouting</td>
<td width="390" valign="top">Put into routing mode (boolean)</td>
</tr>
<tr>
<td width="200" valign="top">routeMode</td>
<td width="390" valign="top">routing mode (walking, driving) (VERouteMode)</td>
</tr>
<tr>
<td width="200" valign="top">autoRoute</td>
<td width="390" valign="top">whether or not to auto route between two points (boolean)</td>
</tr>
<tr>
<td width="200" valign="top">displayCurrentLocation</td>
<td width="390" valign="top">draw crosshair on center and display current lat/lng coordinates (boolean)</td>
</tr>
<tr>
<td width="200" valign="top">displayLatitudeControl</td>
<td width="390" valign="top">control to enter specific latitutde control (reference)</td>
</tr>
<tr>
<td width="200" valign="top">displayLongitudeControl</td>
<td width="390" valign="top">control to enter specific longitude control (reference)</td>
</tr>
<tr>
<td width="200" valign="top">crosshairLocation</td>
<td width="390" valign="top">path to the crosshair image</td>
</tr>
<tr>
<td width="200" valign="top">displayZoom</td>
<td width="390" valign="top">display the current zoom level (boolean)</td>
</tr>
<tr>
<td width="200" valign="top">displayZoomControl</td>
<td width="390" valign="top">control to enter specific zoom level (reference)</td>
</tr>
<tr>
<td width="200" valign="top">displaySearch</td>
<td width="390" valign="top">display a box to search with (boolean)</td>
</tr>
<tr>
<td width="200" valign="top">locationTitle</td>
<td width="390" valign="top">n/a</td>
</tr>
<tr>
<td width="200" valign="top">searchTitle</td>
<td width="390" valign="top">n/a</td>
</tr>
<tr>
<td width="200" valign="top">coordinateTitle</td>
<td width="390" valign="top">n/a</td>
</tr>
<tr>
<td width="200" valign="top">loadAllPins</td>
<td width="390" valign="top">initially load all pins (boolean)</td>
</tr>
<tr>
<td width="200" valign="top">hideCoordinates</td>
<td width="390" valign="top">hides coordinates (boolean)</td>
</tr>
<tr>
<td width="200" valign="top">usePushPins</td>
<td width="390" valign="top">use push pins or a custom shape (boolean)</td>
</tr>
<tr>
<td width="200" valign="top">customShape</td>
<td width="390" valign="top">html for custom shape, used only if usePushPins is false</td>
</tr>
<tr>
<td width="200" valign="top">allowShapeDragging</td>
<td width="390" valign="top">allows shapes to be dragged (boolean)</td>
</tr>
</tbody>
</table>
<p>Downloads</p>
<p>You can download the plugin <a href="https://github.com/anlai/anlai.github.com/tree/master/jqueryUIBingMaps">here</a>.</p>
<p>Enjoy!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/anlai.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/anlai.wordpress.com/118/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/anlai.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/anlai.wordpress.com/118/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/anlai.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/anlai.wordpress.com/118/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/anlai.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/anlai.wordpress.com/118/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/anlai.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/anlai.wordpress.com/118/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/anlai.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/anlai.wordpress.com/118/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/anlai.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/anlai.wordpress.com/118/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=anlai.wordpress.com&amp;blog=12134941&amp;post=118&amp;subd=anlai&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://anlai.wordpress.com/2011/01/13/bing-maps-jquery-ui-widget/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2fba155f9b45f2372dfcea40849c68a6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">anlai</media:title>
		</media:content>
	</item>
		<item>
		<title>Active Directory Permitted Logon Times with C# .Net 3.5 using System.DirectoryServices.AccountManagement</title>
		<link>http://anlai.wordpress.com/2010/09/07/active-directory-permitted-logon-times-with-c-net-3-5-using-system-directoryservices-accountmanagement/</link>
		<comments>http://anlai.wordpress.com/2010/09/07/active-directory-permitted-logon-times-with-c-net-3-5-using-system-directoryservices-accountmanagement/#comments</comments>
		<pubDate>Tue, 07 Sep 2010 17:59:44 +0000</pubDate>
		<dc:creator>anlai</dc:creator>
				<category><![CDATA[Active Directory]]></category>
		<category><![CDATA[PermittedLogonTimes]]></category>
		<category><![CDATA[System.DirectoryServices.AccountManagement]]></category>

		<guid isPermaLink="false">https://anlai.wordpress.com/2010/09/07/active-directory-permitted-logon-times-with-c-net-3-5-using-system-directoryservices-accountmanagement/</guid>
		<description><![CDATA[Recently I was working on a proof of concept for some active directory manipulation.  Using the System.DirectoryServices.AccountManagement was the easiest and best option for managing accounts (as the name implies).  However, the one thing that I really needed was a way to restrict when a particular user would be able to logon. What I discovered [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=anlai.wordpress.com&amp;blog=12134941&amp;post=111&amp;subd=anlai&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Recently I was working on a proof of concept for some active directory manipulation.  Using the System.DirectoryServices.AccountManagement was the easiest and best option for managing accounts (as the name implies).  However, the one thing that I really needed was a way to restrict when a particular user would be able to logon.</p>
<p>What I discovered was that the UserPrincipal class does in fact have a property called PermittedLogonTimes, but the catch is that there is no documentation on how to set the property for specific hours and to make this more confusing it is a byte[].</p>
<p>So after a little bit of playing around in Active Directory, setting the permitted logon times and reading it back out in C# it finally made sense.  The property is basically a byte[21] with a mask to cover the hours the user is allowed to logon.  Each day of the week is broken down into 3 byte values (refer to the table below for the index and the hours).</p>
<table width="400" border="0" cellspacing="0" cellpadding="2">
<tbody>
<tr style="background-color:lightgray;">
<td valign="top" width="81"></td>
<td valign="top" width="18">Sunday</td>
<td valign="top" width="50">Monday</td>
<td valign="top" width="50">Tuesday</td>
<td valign="top" width="50">Wednesday</td>
<td valign="top" width="50">Thursday</td>
<td valign="top" width="50">Friday</td>
<td valign="top" width="49">Saturday</td>
</tr>
<tr>
<td style="background-color:lightgray;" valign="top" width="81">Midnight-8am</td>
<td valign="top" width="18">1</td>
<td valign="top" width="50">4</td>
<td valign="top" width="50">7</td>
<td valign="top" width="50">10</td>
<td valign="top" width="50">13</td>
<td valign="top" width="50">16</td>
<td valign="top" width="49">19</td>
</tr>
<tr>
<td style="background-color:lightgray;" valign="top" width="81">8am-4pm</td>
<td valign="top" width="18">2</td>
<td valign="top" width="50">5</td>
<td valign="top" width="50">8</td>
<td valign="top" width="50">11</td>
<td valign="top" width="50">14</td>
<td valign="top" width="50">17</td>
<td valign="top" width="49">20</td>
</tr>
<tr>
<td style="background-color:lightgray;" valign="top" width="81">4pm-Midnight</td>
<td valign="top" width="18">3</td>
<td valign="top" width="51">6</td>
<td valign="top" width="51">9</td>
<td valign="top" width="52">12</td>
<td valign="top" width="52">15</td>
<td valign="top" width="52">18</td>
<td valign="top" width="53">0</td>
</tr>
</tbody>
</table>
<p>Each hour in each individual block has a specific mask value.  To get a specific time span, all you need to do is add up the values for the hours you want.  Refer to the following table:</p>
<table width="401" border="0" cellspacing="0" cellpadding="2">
<tbody>
<tr style="background-color:lightgray;">
<td valign="top" width="89"></td>
<td valign="top" width="117">Group 1</td>
<td valign="top" width="104">Group 2</td>
<td valign="top" width="89">Group 3</td>
</tr>
<tr>
<td style="background-color:lightgray;" valign="top" width="89">1</td>
<td valign="top" width="117">12am</td>
<td valign="top" width="104">8am</td>
<td valign="top" width="89">4pm</td>
</tr>
<tr>
<td style="background-color:lightgray;" valign="top" width="89">2</td>
<td valign="top" width="117">1am</td>
<td valign="top" width="104">9am</td>
<td valign="top" width="89">5pm</td>
</tr>
<tr>
<td style="background-color:lightgray;" valign="top" width="89">4</td>
<td valign="top" width="117">2am</td>
<td valign="top" width="104">10am</td>
<td valign="top" width="89">6pm</td>
</tr>
<tr>
<td style="background-color:lightgray;" valign="top" width="89">8</td>
<td valign="top" width="117">3am</td>
<td valign="top" width="104">11am</td>
<td valign="top" width="89">7pm</td>
</tr>
<tr>
<td style="background-color:lightgray;" valign="top" width="89">16</td>
<td valign="top" width="117">4am</td>
<td valign="top" width="104">12pm</td>
<td valign="top" width="89">8pm</td>
</tr>
<tr>
<td style="background-color:lightgray;" valign="top" width="89">32</td>
<td valign="top" width="117">5am</td>
<td valign="top" width="104">1pm</td>
<td valign="top" width="89">9pm</td>
</tr>
<tr>
<td style="background-color:lightgray;" valign="top" width="89">64</td>
<td valign="top" width="117">6am</td>
<td valign="top" width="104">2pm</td>
<td valign="top" width="89">10pm</td>
</tr>
<tr>
<td style="background-color:lightgray;" valign="top" width="89">128</td>
<td valign="top" width="117">7am</td>
<td valign="top" width="104">3pm</td>
<td valign="top" width="89">11pm</td>
</tr>
</tbody>
</table>
<p>For example, if you would like to allow logon on Monday from 1pm-5pm your byte array would be all zeros except value at index 5 would be 224 and index 6 would be 1.</p>
<p>I’ve written the following classes to aid in calculating the byte masks:</p>
<p>LogonTime – is used to pass the information for logon for a specific day.</p>
<p>PermittedLogonTime – used to calculate the actual values that need to be passed to Active Directory.</p>
<p><a href="http://gist.github.com/568549">http://gist.github.com/568549</a></p>
<p><em><strong>Update 5/6/2011</strong> </em>: Thanks to comments and testing by Simone Greci, we came to the conclusion that the masks provided here are for Pacific Standard Time (PST, GMT -8).  I would like to update this code when I have time but keep in mind of this limitation.</p>
<p><em><strong>Update 10/18/2011</strong></em>: I&#8217;ve finally gotten around to rewriting the code.  I rewrote everything from the ground up so it also takes into account the timezone.  By default it should go to your machine&#8217;s time zone, but can be passed specific timezones.  I&#8217;ve included code that converts the AD byte mask back into a list of the LogonTime objects.  To make it easier to use, I&#8217;ve compiled it into a project so you can just import the dll and use it.  The project is up on github (<a href="https://github.com/anlai/Permitted-Logon-Times-for-Active-Directory" title="here" target="_blank">here</a>).</p>
<p>There is a demo console app that compares the output to my old code that worked for PST (-8 GMT).</p>
<p>Usage is fairly straight forward:</p>
<p>To create a new logon time using your machine&#8217;s time zone:</p>
<pre class="csharpcode">var time = new LogonTime(DayOfWeek.Monday,
new DateTime(2011, 1, 1, 8, 0, 0),
new DateTime(2011, 1, 1, 10, 0, 0));</pre>
<p>To use a specific time zone:</p>
<pre class="csharpcode">var zone = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time");
var time = new LogonTime(DayOfWeek.Monday,
     new DateTime(2011, 1, 1, 8, 0, 0),
     new DateTime(2011, 1, 1, 10, 0, 0), zone);</pre>
<p>To get the byte mask to submit to AD:</p>
<pre class="csharpcode">var zone = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time");
var time = new LogonTime(DayOfWeek.Monday,
     new DateTime(2011, 1, 1, 8, 0, 0),
     new DateTime(2011, 1, 1, 10, 0, 0), zone);
var times = new List&lt;LogonTime&gt;();
times.add(time);
var mask = PermittedLogonTimes.GetByteMask(times)</pre>
<p>To get the list of times from the AD mask:</p>
<pre class="csharpcode">byte[] mask;// populate from AD
var times = PermittedLogonTimes.GetLogonTimes(mask);</pre>
<p>*The resulting times that are parsed have invalid dates, just the hour ranges.</p>
<p>I hope this helps those of you using those permitted logon times.  Enjoy!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/anlai.wordpress.com/111/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/anlai.wordpress.com/111/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/anlai.wordpress.com/111/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/anlai.wordpress.com/111/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/anlai.wordpress.com/111/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/anlai.wordpress.com/111/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/anlai.wordpress.com/111/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/anlai.wordpress.com/111/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/anlai.wordpress.com/111/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/anlai.wordpress.com/111/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/anlai.wordpress.com/111/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/anlai.wordpress.com/111/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/anlai.wordpress.com/111/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/anlai.wordpress.com/111/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=anlai.wordpress.com&amp;blog=12134941&amp;post=111&amp;subd=anlai&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://anlai.wordpress.com/2010/09/07/active-directory-permitted-logon-times-with-c-net-3-5-using-system-directoryservices-accountmanagement/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2fba155f9b45f2372dfcea40849c68a6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">anlai</media:title>
		</media:content>
	</item>
		<item>
		<title>Updated: Enabling SSL/HTTPS on Team Foundation Server 2010 RTM</title>
		<link>http://anlai.wordpress.com/2010/05/07/updated-enabling-sslhttps-on-team-foundation-server-2010-rtm/</link>
		<comments>http://anlai.wordpress.com/2010/05/07/updated-enabling-sslhttps-on-team-foundation-server-2010-rtm/#comments</comments>
		<pubDate>Fri, 07 May 2010 16:03:15 +0000</pubDate>
		<dc:creator>anlai</dc:creator>
				<category><![CDATA[TFS]]></category>
		<category><![CDATA[SSL]]></category>
		<category><![CDATA[Team Foundation Server]]></category>
		<category><![CDATA[TFS 2010]]></category>

		<guid isPermaLink="false">https://anlai.wordpress.com/2010/05/07/updated-enabling-sslhttps-on-team-foundation-server-2010-rtm/</guid>
		<description><![CDATA[Not too long ago I posted a set of instructions on how to setup SSL/HTTPS for TFS 2010 RTM (here).&#160; But it had a few short comings, ie. Report Server was not over SSL and TFS had no idea the Sharepoint was running over SSL either or even the FQDN I was using for the [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=anlai.wordpress.com&amp;blog=12134941&amp;post=99&amp;subd=anlai&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Not too long ago I posted a set of instructions on how to setup SSL/HTTPS for TFS 2010 RTM (<a href="http://anlai.wordpress.com/2010/04/22/enabling-sslhttps-on-team-foundation-server-2010-rtm/">here</a>).&#160; But it had a few short comings, ie. Report Server was not over SSL and TFS had no idea the Sharepoint was running over SSL either or even the FQDN I was using for the site.&#160; Since then I’ve been hacking away at trying to fix those short comings and as far as I can tell everything seems to be functioning now.&#160; Instead of completely editing the old post, I’ll just give a new straight forward set of instructions.</p>
<h4>Prerequisites:</h4>
<ol>
<li>Have the basic TFS install completed along with the configuration. </li>
<li>FQDN you would like to use, for this example I will be using “mycompany.com” </li>
<li>A certificate from a Microsoft Certificate Services Server (this cannot be a self-signed certificate because Visual Studio Team Explorer will not accept it) </li>
</ol>
<ul>To request the certificate from Microsoft Certificate Services use the following steps:
<li>Open up the IIS Manager and select the server </li>
<li>Select “Server Certificate” </li>
<li>In the Actions pane &gt; select “Create Domain Certificate” </li>
<li>Follow the steps in the “Create Certificate” dialog. </li>
</ul>
<p>Here is some basic information I’ll be using during this guide:</p>
<table border="0" cellspacing="0" cellpadding="2" width="400">
<tbody>
<tr>
<td valign="top" width="200">Server Name:</td>
<td valign="top" width="200">tfs-server</td>
</tr>
<tr>
<td valign="top" width="200">FQDN:</td>
<td valign="top" width="200">mycompany.com</td>
</tr>
<tr>
<td valign="top" width="200">Certificate Name:</td>
<td valign="top" width="200">tfs-cert</td>
</tr>
</tbody>
</table>
<p>&#160;</p>
<h4>Steps:</h4>
<h5>Configure Sharepoint:</h5>
<ul>
<li>Open up SharePoint Administrator </li>
<li>Navigate to the “Operations” tab&#160;&#160; </li>
<li>Select “Alternate Access Mappings”<a href="http://anlai.files.wordpress.com/2010/05/sharepoint1.png"><img style="display:inline;border-width:0;" title="sharepoint1" border="0" alt="sharepoint1" src="http://anlai.files.wordpress.com/2010/05/sharepoint1_thumb.png?w=504&#038;h=306" width="504" height="306" /></a>&#160; </li>
<li>Click on “Edit Public URLs”<a href="http://anlai.files.wordpress.com/2010/05/sharepoint2.png"><img style="display:inline;border-width:0;" title="sharepoint2" border="0" alt="sharepoint2" src="http://anlai.files.wordpress.com/2010/05/sharepoint2_thumb.png?w=504&#038;h=308" width="504" height="308" /></a> </li>
<li>Select the “Default Web Site”<a href="http://anlai.files.wordpress.com/2010/05/sharepoint3.png"><img style="display:inline;border-width:0;" title="sharepoint3" border="0" alt="sharepoint3" src="http://anlai.files.wordpress.com/2010/05/sharepoint3_thumb.png?w=504&#038;h=302" width="504" height="302" /></a> <a href="http://anlai.files.wordpress.com/2010/05/sharepoint4.png"><img style="display:inline;border-width:0;" title="sharepoint4" border="0" alt="sharepoint4" src="http://anlai.files.wordpress.com/2010/05/sharepoint4_thumb.png?w=504&#038;h=308" width="504" height="308" /></a> <a href="http://anlai.files.wordpress.com/2010/05/sharepoint5.png"><img style="display:inline;border-width:0;" title="sharepoint5" border="0" alt="sharepoint5" src="http://anlai.files.wordpress.com/2010/05/sharepoint5_thumb.png?w=504&#038;h=138" width="504" height="138" /></a> </li>
<li>Change the “Default” from “http://tfs-server” to “https://mycompany.com”<a href="http://anlai.files.wordpress.com/2010/05/sharepoint6.png"><img style="display:inline;border-width:0;" title="sharepoint6" border="0" alt="sharepoint6" src="http://anlai.files.wordpress.com/2010/05/sharepoint6_thumb.png?w=504&#038;h=208" width="504" height="208" /></a> </li>
<li>Click “Save” </li>
<li>That should be it with Sharepoint Administrator. </li>
<li>One last thing is that we need to test the site.&#160; When I did the initial configuration I was unable to navigate to the Sharepoint site from the server it self but was able to from client machines.&#160; The site would prompt me for credentials over and over but would not let me into the site.&#160; So just open a browser from the server and try to navigate to “https://mycompany.com/sites/defaultcollection”.&#160; If that doesn’t work then you need to follow the next step, otherwise you are complete. </li>
<li>I came across this <a href="http://yagyashree.wordpress.com/2009/06/06/site-not-browse-able-with-host-header-401-1-error/">blog post</a> that describes the very problem.&#160; In the end I had to disable the loopback check, but different solutions may solve your problem. </li>
</ul>
<h5>Configure Reporting Services:</h5>
<ul>
<li>Open up “Reporting Services Configuration Manager” </li>
<li>Select “Web Service URL” </li>
<li>In the right panel, select “tfs-cert” as the SSL Certificate and 443 as the SSL Port.<a href="http://anlai.files.wordpress.com/2010/05/reporting1.png"><img style="display:inline;border-width:0;" title="reporting1" border="0" alt="reporting1" src="http://anlai.files.wordpress.com/2010/05/reporting1_thumb.png?w=504&#038;h=381" width="504" height="381" /></a> </li>
<li>Select Apply </li>
<li>Select “Report Manager URL” </li>
<li>In the right panel, select “Advanced”<a href="http://anlai.files.wordpress.com/2010/05/reporting2.png"><img style="display:inline;border-width:0;" title="reporting2" border="0" alt="reporting2" src="http://anlai.files.wordpress.com/2010/05/reporting2_thumb.png?w=504&#038;h=381" width="504" height="381" /></a> </li>
<li>In the “Advanced Multiple Web Site Configuration” window that pops up click “Add” under the “Multiple SSL Identities for Report Manager”<a href="http://anlai.files.wordpress.com/2010/05/reporting3.png"><img style="display:inline;border-width:0;" title="reporting3" border="0" alt="reporting3" src="http://anlai.files.wordpress.com/2010/05/reporting3_thumb.png?w=304&#038;h=284" width="304" height="284" /></a> </li>
<li>The “Add a Report Manager SSL Binding” window will pop-up, just select “tfs-cert” and it will automatically get the URL from the certificate.<a href="http://anlai.files.wordpress.com/2010/05/reporting4.png"><img style="display:inline;border-width:0;" title="reporting4" border="0" alt="reporting4" src="http://anlai.files.wordpress.com/2010/05/reporting4_thumb.png?w=304&#038;h=185" width="304" height="185" /></a> </li>
<li>Click “OK” until you get back to the main Reporting Services Configuration window. </li>
<li>That should be it for the Reporting Services Configuration. </li>
</ul>
<h5>Configure IIS:</h5>
<ul>
<li>Open IIS Manager, you should see something similar to the image below in your left panel.      <br /><a href="http://anlai.files.wordpress.com/2010/05/iis1.png"><img style="display:inline;border-width:0;" title="iis1" border="0" alt="iis1" src="http://anlai.files.wordpress.com/2010/05/iis1_thumb.png?w=404&#038;h=174" width="404" height="174" /></a> </li>
<li>Select “Default Web Site” and select “Bindings” in the Action Pane.<a href="http://anlai.files.wordpress.com/2010/05/iis2.png"><img style="display:inline;border-width:0;" title="iis2" border="0" alt="iis2" src="http://anlai.files.wordpress.com/2010/05/iis2_thumb.png?w=504&#038;h=281" width="504" height="281" /></a> </li>
<li>Click “Add” in the “Site Bindings” pop-up. </li>
<li>Change the following values:<br />
<table border="0" cellspacing="0" cellpadding="2" width="284">
<tbody>
<tr>
<td valign="top" width="127">Type:</td>
<td valign="top" width="155">https</td>
</tr>
<tr>
<td valign="top" width="127">Port:</td>
<td valign="top" width="155">443</td>
</tr>
<tr>
<td valign="top" width="127">SSL Certificate:</td>
<td valign="top" width="155">tfs-cert</td>
</tr>
</tbody>
</table>
<p>     <a href="http://anlai.files.wordpress.com/2010/05/iis3.png"><img style="display:inline;border-width:0;" title="iis3" border="0" alt="iis3" src="http://anlai.files.wordpress.com/2010/05/iis3_thumb.png?w=304&#038;h=170" width="304" height="170" /></a> </li>
<li>Click “Ok” in the Add Site Binding and “Close” in “Site Bindings” </li>
<li>You will need to perform the same steps for the “Team Foundation Server” website except use port 8088 instead of 443. </li>
<li>That will be it for IIS Manager. </li>
</ul>
<h5>Configure Firewall:</h5>
<p>You will need to ensure that your firewall is allowing 443 and 8088 in.</p>
<h5>Configure TFS</h5>
<ul>
<li>Open up “Team Foundation Server Administration Console” </li>
<li>Navigate to the &quot;Application Tier&quot; </li>
<li>In the right pane, select &quot;Change URLs&quot;. </li>
<li>In the &quot;Change URLs&quot; pop up, change the Notification URL to “https://mycompany.com:8088/tfs&quot;<a href="http://anlai.files.wordpress.com/2010/05/tfs.png"><img style="border-bottom:0;border-left:0;display:inline;border-top:0;border-right:0;" title="tfs" border="0" alt="tfs" src="http://anlai.files.wordpress.com/2010/05/tfs_thumb.png?w=504&#038;h=287" width="504" height="287" /></a> </li>
<li>Click “Ok”, we are finished configuring the Application Tier.</li>
<li>Navigate to the “Sharepoint Web Applications” </li>
<li>In the right pane, select the “http://tfs-server” application and click “Change”<a href="http://anlai.files.wordpress.com/2010/05/tfs1.png"><img style="display:inline;border-width:0;" title="tfs1" border="0" alt="tfs1" src="http://anlai.files.wordpress.com/2010/05/tfs1_thumb.png?w=504&#038;h=369" width="504" height="369" /></a> </li>
<li>Change the values in the “Sharepoint Web Application Settings”<a href="http://anlai.files.wordpress.com/2010/05/tfs2.png"><img style="display:inline;border-width:0;" title="tfs2" border="0" alt="tfs2" src="http://anlai.files.wordpress.com/2010/05/tfs2_thumb.png?w=304&#038;h=308" width="304" height="308" /></a><br />
<table border="0" cellspacing="0" cellpadding="2" width="402">
<tbody>
<tr>
<td valign="top" width="208">Friendly Name:</td>
<td valign="top" width="192">mycompany.com</td>
</tr>
<tr>
<td valign="top" width="208">Web Application URL:</td>
<td valign="top" width="192"><a href="https://mycompany.com">https://mycompany.com</a></td>
</tr>
<tr>
<td valign="top" width="208">Central Administration URL:</td>
<td valign="top" width="192"><a href="http://tfs-server:17012">http://tfs-server:17012</a></td>
</tr>
<tr>
<td valign="top" width="208">Default Location:</td>
<td valign="top" width="192">sites</td>
</tr>
</tbody>
</table>
</li>
<li>Navigate to “Reporting” in the left pane. </li>
<li>In the right pane select “Edit”<a href="http://anlai.files.wordpress.com/2010/05/tfs3.png"><img style="display:inline;border-width:0;" title="tfs3" border="0" alt="tfs3" src="http://anlai.files.wordpress.com/2010/05/tfs3_thumb.png?w=504&#038;h=364" width="504" height="364" /></a> </li>
<li>The “Reporting” window will popup.&#160; Select the “Reports” tab. </li>
<li>Select the “Populate URLs”, this will cause the drop downs in the tab to refresh with what the Report Server has configured.      <br /><a href="http://anlai.files.wordpress.com/2010/05/tfs4.png"><img style="display:inline;border-width:0;" title="tfs4" border="0" alt="tfs4" src="http://anlai.files.wordpress.com/2010/05/tfs4_thumb.png?w=304&#038;h=393" width="304" height="393" /></a> </li>
<li>Change the drop downs in the URL section to the https addresses that were created earlier.<br />
<table border="0" cellspacing="0" cellpadding="2" width="402">
<tbody>
<tr>
<td valign="top" width="200">Web Service:</td>
<td valign="top" width="200"><a href="https://mycompany.com/reportserver">https://mycompany.com/reportserver</a></td>
</tr>
<tr>
<td valign="top" width="200">Report Manager:</td>
<td valign="top" width="200"><a href="https://mycompany.com/reports">https://mycompany.com/reports</a></td>
</tr>
</tbody>
</table>
</li>
<li>Once you click “Ok”, be sure to click “Start Jobs” in the Reporting pane.      </li>
</ul>
<p>Congratulations!&#160; You have finished the configuration.&#160; Enjoy!</p>
<p>&#160;</p>
<p><em>Update (5/18/2010)</em>: Thanks to the comment by Jason, I have added an extra step to configure the Application Tier in the TFS Administration Console.</p>
<ul></ul>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/anlai.wordpress.com/99/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/anlai.wordpress.com/99/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/anlai.wordpress.com/99/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/anlai.wordpress.com/99/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/anlai.wordpress.com/99/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/anlai.wordpress.com/99/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/anlai.wordpress.com/99/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/anlai.wordpress.com/99/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/anlai.wordpress.com/99/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/anlai.wordpress.com/99/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/anlai.wordpress.com/99/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/anlai.wordpress.com/99/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/anlai.wordpress.com/99/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/anlai.wordpress.com/99/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=anlai.wordpress.com&amp;blog=12134941&amp;post=99&amp;subd=anlai&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://anlai.wordpress.com/2010/05/07/updated-enabling-sslhttps-on-team-foundation-server-2010-rtm/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2fba155f9b45f2372dfcea40849c68a6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">anlai</media:title>
		</media:content>

		<media:content url="http://anlai.files.wordpress.com/2010/05/sharepoint1_thumb.png" medium="image">
			<media:title type="html">sharepoint1</media:title>
		</media:content>

		<media:content url="http://anlai.files.wordpress.com/2010/05/sharepoint2_thumb.png" medium="image">
			<media:title type="html">sharepoint2</media:title>
		</media:content>

		<media:content url="http://anlai.files.wordpress.com/2010/05/sharepoint3_thumb.png" medium="image">
			<media:title type="html">sharepoint3</media:title>
		</media:content>

		<media:content url="http://anlai.files.wordpress.com/2010/05/sharepoint4_thumb.png" medium="image">
			<media:title type="html">sharepoint4</media:title>
		</media:content>

		<media:content url="http://anlai.files.wordpress.com/2010/05/sharepoint5_thumb.png" medium="image">
			<media:title type="html">sharepoint5</media:title>
		</media:content>

		<media:content url="http://anlai.files.wordpress.com/2010/05/sharepoint6_thumb.png" medium="image">
			<media:title type="html">sharepoint6</media:title>
		</media:content>

		<media:content url="http://anlai.files.wordpress.com/2010/05/reporting1_thumb.png" medium="image">
			<media:title type="html">reporting1</media:title>
		</media:content>

		<media:content url="http://anlai.files.wordpress.com/2010/05/reporting2_thumb.png" medium="image">
			<media:title type="html">reporting2</media:title>
		</media:content>

		<media:content url="http://anlai.files.wordpress.com/2010/05/reporting3_thumb.png" medium="image">
			<media:title type="html">reporting3</media:title>
		</media:content>

		<media:content url="http://anlai.files.wordpress.com/2010/05/reporting4_thumb.png" medium="image">
			<media:title type="html">reporting4</media:title>
		</media:content>

		<media:content url="http://anlai.files.wordpress.com/2010/05/iis1_thumb.png" medium="image">
			<media:title type="html">iis1</media:title>
		</media:content>

		<media:content url="http://anlai.files.wordpress.com/2010/05/iis2_thumb.png" medium="image">
			<media:title type="html">iis2</media:title>
		</media:content>

		<media:content url="http://anlai.files.wordpress.com/2010/05/iis3_thumb.png" medium="image">
			<media:title type="html">iis3</media:title>
		</media:content>

		<media:content url="http://anlai.files.wordpress.com/2010/05/tfs_thumb.png" medium="image">
			<media:title type="html">tfs</media:title>
		</media:content>

		<media:content url="http://anlai.files.wordpress.com/2010/05/tfs1_thumb.png" medium="image">
			<media:title type="html">tfs1</media:title>
		</media:content>

		<media:content url="http://anlai.files.wordpress.com/2010/05/tfs2_thumb.png" medium="image">
			<media:title type="html">tfs2</media:title>
		</media:content>

		<media:content url="http://anlai.files.wordpress.com/2010/05/tfs3_thumb.png" medium="image">
			<media:title type="html">tfs3</media:title>
		</media:content>

		<media:content url="http://anlai.files.wordpress.com/2010/05/tfs4_thumb.png" medium="image">
			<media:title type="html">tfs4</media:title>
		</media:content>
	</item>
		<item>
		<title>Enabling SSL/HTTPS on Team Foundation Server 2010 RTM</title>
		<link>http://anlai.wordpress.com/2010/04/22/enabling-sslhttps-on-team-foundation-server-2010-rtm/</link>
		<comments>http://anlai.wordpress.com/2010/04/22/enabling-sslhttps-on-team-foundation-server-2010-rtm/#comments</comments>
		<pubDate>Thu, 22 Apr 2010 22:51:21 +0000</pubDate>
		<dc:creator>anlai</dc:creator>
				<category><![CDATA[TFS]]></category>
		<category><![CDATA[SSL]]></category>
		<category><![CDATA[Team Foundation Server]]></category>
		<category><![CDATA[TFS 2010]]></category>

		<guid isPermaLink="false">http://anlai.wordpress.com/2010/04/22/enabling-sslhttps-on-team-foundation-server-2010-rtm/</guid>
		<description><![CDATA[Update: I&#8217;ve been working on some of the issues from this guide and figured out a good portion of them.  Please take a look at my updated guide here. I’ve found lots of guides on the internet on setting up SSL/HTTPS on Team Foundation Server 2008, but not much on 2010 RTM.  It’s pretty much [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=anlai.wordpress.com&amp;blog=12134941&amp;post=45&amp;subd=anlai&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><em><strong>Update</strong>: I&#8217;ve been working on some of the issues from this guide and figured out a good portion of them.  Please take a look at my updated guide <a href="http://anlai.wordpress.com/2010/05/07/updated-enabling-sslhttps-on-team-foundation-server-2010-rtm/">here</a>.</em></p>
<p>I’ve found lots of guides on the internet on setting up SSL/HTTPS on Team Foundation Server 2008, but not much on 2010 RTM.  It’s pretty much the same process but I had to figure a few things out differently because of IIS7 and just my personal preferences.</p>
<p>First of all, if you are using Visual Studio 2008 you will need to make sure you have the following (doesn’t really have anything to do with enabling SSL/HTTPS, but you’ll need it to connect to TFS 2010 anyways):</p>
<ul>
<li>Download and install the Visual Studio Team System 2008 Service Pack 1 Forward Compatibility Update for Team Foundation Server 2010 (Installer) found <a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=cf13ea45-d17b-4edc-8e6c-6c5b208ec54d&amp;displaylang=en">here</a>.  Fun little name isn’t it?</li>
<li>Ensure that you’ve installed Visual Studio 2008 SP1 after installing TFS Team Explorer.
<ul>You’ll first need two SSL certifications, one for SharePoint and one for TFS application layer.  It maybe possible to use one SSL certification but I like to have two so i can give each a different address.  Ex. mycompany.com and mycompanysource.com.  First I tried using two self-signed certificates but that didn’t work because Team Explorer doesn’t like self-signed certificates, but the certificate for SharePoint can use a self-signed certificate.  We used Microsoft Certificate Services to provide the certificate necessary for the TFS application layer.</ul>
<ul>To request the certificate from Microsoft Certificate Services use the following steps:</ul>
</li>
<li>Open up the IIS Manager and select the server</li>
<li>Select “Server Certificate”</li>
<li>In the Actions pane &gt; select “Create Domain Certificate”</li>
<li>Follow the steps in the “Create Certificate” dialog.</li>
</ul>
<ul>Once you have your two certificates, follow the next configuration steps:</ul>
<h5>Configure IIS</h5>
<ul>
<li>Open IIS Manager and select the server</li>
<li>Expand the “Sites”, you should see a list similar to the following<br />
<a href="http://anlai.files.wordpress.com/2010/04/iismanager1.png"><img style="display:inline;border-width:0;" title="iismanager1" src="http://anlai.files.wordpress.com/2010/04/iismanager1_thumb.png?w=244&#038;h=237" border="0" alt="iismanager1" width="244" height="237" /></a><br />
Default Web Site = SharePoint Site<br />
Team Foundation Sever = TFS Application Layer<br />
SharePoint redirector = redirector for SharePoint (I’ll explain later)</li>
<li>Select the “Default Web Site”</li>
<li>In the Actions Pane select “Bindings…”</li>
<li>In the Site Bindings window, select “Add”, which will bring up the “Edit Site Binding” page.<br />
<a href="http://anlai.files.wordpress.com/2010/04/iismanager2.png"><img style="display:inline;border-width:0;" title="iismanager2" src="http://anlai.files.wordpress.com/2010/04/iismanager2_thumb.png?w=399&#038;h=215" border="0" alt="iismanager2" width="399" height="215" /></a></li>
<li>Select the following:<br />
Type: https<br />
IP Address: all unassigned<br />
Port: 443<br />
SSL certificate: the certificate you created for SharePoint</li>
<li>Click “Ok”, then “Close” in the “Site Bindings” window.</li>
<li>Perform the same steps with the “Team Foundation Server” site, except use port 8088 for the port and the certificate created for the TFS application layer.</li>
<li>Close IIS Manager, we are done with it.</li>
</ul>
<h5>Configure Firewall</h5>
<ul>
<li>Open “Windows Firewall with Advanced Security”</li>
<li>Select &#8216;”Inbound Rules”</li>
<li>Find “Team Foundation Server TFSWebSite:8080”, right click and choose disable.</li>
<li>In the right Actions pane, select “New Rule”</li>
<li>In the “New Inbound rule wizard” fill the following:<br />
Type: Port<br />
TCP/UDP: TCP<br />
Specific local port: 8088<br />
Allow the Connection<br />
Domain,Private,Public<br />
Name: Name of your choice</li>
</ul>
<h5>Configure SharePoint</h5>
<ul>
<li>Open up the SharePoint Administrator</li>
<li>Select the “Operations” tab, then under “Global Configuration” select “Alternate Access Mappings”<br />
<a href="http://anlai.files.wordpress.com/2010/04/sharepoint11.png"><img style="display:inline;border:0;" title="sharepoint1" src="http://anlai.files.wordpress.com/2010/04/sharepoint1_thumb1.png?w=463&#038;h=374" border="0" alt="sharepoint1" width="463" height="374" /></a></li>
<li>In the “Alternate Access Mappings” select “Edit Public URLs”</li>
<li>First select the “Alternate Access Mapping Collection” and choose the “Default Web Site” in the pop-up.</li>
<li>Fill in the default and Internet addresses.<br />
Default: http://servername (leave default alone)<br />
Internet: https://mycompanysource.com</li>
<li>Click “Save”</li>
</ul>
<p>At this point you should have SSL setup for both the TFS SharePoint sites and the TFS application layer.  In Team Explorer you should be able to add a server by entering “https://mycompanysource.com:8088/tfs” as the address.</p>
<p>The only thing left to do is make the SharePoint sites a bit easier to access.  Right now you would have to access the SharePoint site by going to https://mycompany.com/tfs/defaultcollection, but wouldn’t it be nice to just type mycompany.com in the address bar and be redirected?  Once you complete these final steps you should be able to do just that.</p>
<ul>
<li>Open up IIS manager.</li>
<li>Select your server and right click on “Sites” and choose “Add Web Site”</li>
<li>Fill in the following information:<br />
Site Name: “SharePoint Redirector”<br />
Physical Path: doesn’t matter i use c:\inetpub<br />
Binding: Leave as port 80 and defaults.</li>
<li>Click “Ok”</li>
<li>Select the redirector and in the main window double-click on “HTTP Redirect”</li>
<li>Check Redirect request to destination and fill in your target destination. i.e.. https://mycompany.com/sites/defaultcollection</li>
<li>Click “Apply” in the Actions Pane</li>
</ul>
<p>Ok that’s all I got for this post, today.  Enjoy your newly secured TFS server.</p>
<p><strong><em>Update (4/26/2010)</em></strong>:  Apparently there is a little funny business with accessing the report server from the outside network.  Instead of using the FQDN to get to the report server it uses the computer name.  So outside the local network it doesn’t work from the SharePoint site.  There are some steps to get it working, but I can’t quite get SharePoint over SSL to work properly on the server itself resulting in some problems with the TFS configuration tool.</p>
<p>First setting up SharePoint SSL slightly differently than I’ve stated above similar to the instructions <a href="http://manish-sharepoint.blogspot.com/2008/05/creating-ssl-enabled-site-collection-in.html">here</a>. Then the following steps are the issues.</p>
<p>Part of the problem is that I cannot access https://mycompany.com/tfs/defaultcollection from the server itself, but I can access it from other computers.  I believe that because of this problem changing the configuration using TFS Administration Console is a problem.  Clicking on the Grant Access button</p>
<p><a href="http://anlai.files.wordpress.com/2010/04/tfs4.png"><img style="display:inline;border:0;" title="tfs4" src="http://anlai.files.wordpress.com/2010/04/tfs4_thumb.png?w=463&#038;h=347" border="0" alt="tfs4" width="463" height="347" /></a></p>
<p>Fill in the information for Url for Team Foundation Server : to https://mycompanysource:8088/tfs.  Then in the &#8220;SharePoint Web Application” select the https://.. site from the drop down.  When you click on ok I get an error message saying TFS cannot access the SharePoint site.</p>
<p><a href="http://anlai.files.wordpress.com/2010/04/tfs5.png"><img style="display:inline;border:0;" title="tfs5" src="http://anlai.files.wordpress.com/2010/04/tfs5_thumb.png?w=463&#038;h=417" border="0" alt="tfs5" width="463" height="417" /></a></p>
<p>Once this issue with the SharePoint SSL is resolved it should also resolve configuring Reporting Services for SSL, then modifying the configuration for TFS Administration Console for SSL reporting services.</p>
<p>Configuring SSL for reporting services is pretty straight forward.</p>
<p>Open up the Reporting Services Configuration Manager and go to the “Web Service URL”.  Configure the SSL Certificate and the SSL Port.</p>
<p><a href="http://anlai.files.wordpress.com/2010/04/reporting1.png"><img style="display:inline;border:0;" title="reporting1" src="http://anlai.files.wordpress.com/2010/04/reporting1_thumb.png?w=463&#038;h=348" border="0" alt="reporting1" width="463" height="348" /></a></p>
<p>So one problem is sort of holding up the whole issue with configuring the server to accept the reporting services over SSL.  Anyone have any ideas, I’m open to suggestions.</p>
<p><em><strong>Update (5/7/2010) </strong>: I&#8217;ve been working on some of the issues from this  guide and figured out a good portion of them.  Please take a look at my  updated guide <a href="http://anlai.wordpress.com/2010/05/07/updated-enabling-sslhttps-on-team-foundation-server-2010-rtm/">here</a>.</em></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/anlai.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/anlai.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/anlai.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/anlai.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/anlai.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/anlai.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/anlai.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/anlai.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/anlai.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/anlai.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/anlai.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/anlai.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/anlai.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/anlai.wordpress.com/45/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=anlai.wordpress.com&amp;blog=12134941&amp;post=45&amp;subd=anlai&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://anlai.wordpress.com/2010/04/22/enabling-sslhttps-on-team-foundation-server-2010-rtm/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2fba155f9b45f2372dfcea40849c68a6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">anlai</media:title>
		</media:content>

		<media:content url="http://anlai.files.wordpress.com/2010/04/iismanager1_thumb.png" medium="image">
			<media:title type="html">iismanager1</media:title>
		</media:content>

		<media:content url="http://anlai.files.wordpress.com/2010/04/iismanager2_thumb.png" medium="image">
			<media:title type="html">iismanager2</media:title>
		</media:content>

		<media:content url="http://anlai.files.wordpress.com/2010/04/sharepoint1_thumb1.png" medium="image">
			<media:title type="html">sharepoint1</media:title>
		</media:content>

		<media:content url="http://anlai.files.wordpress.com/2010/04/tfs4_thumb.png" medium="image">
			<media:title type="html">tfs4</media:title>
		</media:content>

		<media:content url="http://anlai.files.wordpress.com/2010/04/tfs5_thumb.png" medium="image">
			<media:title type="html">tfs5</media:title>
		</media:content>

		<media:content url="http://anlai.files.wordpress.com/2010/04/reporting1_thumb.png" medium="image">
			<media:title type="html">reporting1</media:title>
		</media:content>
	</item>
		<item>
		<title>Configuring Team Foundation Server Permissions for Small Groups</title>
		<link>http://anlai.wordpress.com/2010/04/22/configuring-team-foundation-server-for-small-groups/</link>
		<comments>http://anlai.wordpress.com/2010/04/22/configuring-team-foundation-server-for-small-groups/#comments</comments>
		<pubDate>Thu, 22 Apr 2010 21:34:32 +0000</pubDate>
		<dc:creator>anlai</dc:creator>
				<category><![CDATA[TFS]]></category>
		<category><![CDATA[SSL]]></category>
		<category><![CDATA[Team Foundation Server]]></category>
		<category><![CDATA[TFS 2010]]></category>

		<guid isPermaLink="false">http://anlai.wordpress.com/2010/04/22/configuring-team-foundation-server-for-small-groups/</guid>
		<description><![CDATA[Team Foundation Server (TFS) is a pretty good source control and process guidance tool, especially with the release of the latest version TFS 2010.  One benefit is that it allows extremely granular permissions which are great for large enterprise setups, but I work in a small group where everyone needs to have access to everyone’s [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=anlai.wordpress.com&amp;blog=12134941&amp;post=36&amp;subd=anlai&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Team Foundation Server (TFS) is a pretty good source control and process guidance tool, especially with the release of the latest version TFS 2010.  One benefit is that it allows extremely granular permissions which are great for large enterprise setups, but I work in a small group where everyone needs to have access to everyone’s files.  So it becomes sort of a pain because unless you add everyone into the administrators group you need to add permissions manually to everything.</p>
<p>One thing to understand about TFS is that it is really 3 separate applications working together, TFS Application Layer, Microsoft SQL Server Reporting Services and Microsoft Sharepoint Services.  And since they don’t really talk with each other about permissions, these need to be granted individually to each application.</p>
<p>I’ve come up with the following steps, even though they may not be best practices they work for my environment.  Before beginning I recommend setting up a security group that will contain all of your users that you wish to have access to the TFS server.</p>
<h5>TFS Application Layer Permissions</h5>
<ul>
<li>Open up the Team Foundation Server Administration Console</li>
<li>Expand Server Name &gt; Application Tier &gt; Team Project Collections</li>
<li>Select “Group Membership”</li>
<li><a href="http://anlai.files.wordpress.com/2010/04/tfsadminconsole1.png"><img style="display:inline;border:0;" title="tfs-adminconsole1" src="http://anlai.files.wordpress.com/2010/04/tfsadminconsole1_thumb.png?w=442&#038;h=332" border="0" alt="tfs-adminconsole1" width="442" height="332" /></a></li>
<li>In the “Global Groups on http://localhost:8080/tfs/defaultcollection” window click “New…” button.</li>
<li>In the “Create New Team Foundation Server Group” fill in “User” as “Group Name” and a Description if you choose.  And click “Ok”</li>
<li><a href="http://anlai.files.wordpress.com/2010/04/tfsadminconsole2.png"><img style="display:inline;border:0;" title="tfs-adminconsole2" src="http://anlai.files.wordpress.com/2010/04/tfsadminconsole2_thumb.png?w=442&#038;h=293" border="0" alt="tfs-adminconsole2" width="442" height="293" /></a></li>
<li>In the “Global Groups on http://localhost:8080/tfs/defaultcollection” window, select the newly created group and click the “Properties” button.</li>
<li>In the properties window add your users that you wish to have access to all projects.</li>
</ul>
<h5>Sharepoint Permissions</h5>
<p>Sharepoint permissions need to be sort of granted individually for each project that you have.  But with the way I have it set up it should be slightly easier to manage.  All users are granted to the main site in Sharepoint.  Each project’s site is a sub site of the main site and can inherit the permissions from the main site.  The first part is granting permissions to the main site.</p>
<ul>
<li>Log in to your Sharepoint site (most likely http://localhost/tfs/defaultcollection) as an administrator</li>
<li>Select “Site Action” &gt; “Site Settings” &gt; “Advanced Permissions”</li>
<li>In the permissions page you will want to add all of your users as contributors, this is where that security group will come in handy as well.</li>
</ul>
<p>The next step is for each project that you have going on, you need to set it to inherit permissions.</p>
<ul>
<li>Once again log into your Sharepoint site.</li>
<li>Select the project you would like to change (url example http://localhost/tfs/defaultcollection/projectname)</li>
<li>Select “Site Action” &gt; “Site Settings” &gt; “Advanced Permissions”</li>
<li>In the permissions page select “Actions” &gt; “Inherit Permissions”</li>
</ul>
<p>In the end permissions will be automatically updated if you edit the permissions on the main site or if you decided to setup the Active Directory group changing membership in the group.</p>
<h5>Report Server Permissions</h5>
<ul>
<li>Log in to your reporting services management site (usually <a href="http://localhost/reports">http://localhost/reports</a>)</li>
<li>Click on “Properties” &gt; “New Role Assignment”</li>
<li>In the “New Role Assignment” screen, add your user (or security group) and select the “Browser” role.</li>
<li><a href="http://anlai.files.wordpress.com/2010/04/reportingservices1.png"><img style="display:inline;border:0;" title="reportingservices1" src="http://anlai.files.wordpress.com/2010/04/reportingservices1_thumb.png?w=477&#038;h=166" border="0" alt="reportingservices1" width="477" height="166" /></a></li>
</ul>
<p>Congratulations your permissions are now granted so everyone in your group can access all the Sharepoint sites and all the source control.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/anlai.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/anlai.wordpress.com/36/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/anlai.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/anlai.wordpress.com/36/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/anlai.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/anlai.wordpress.com/36/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/anlai.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/anlai.wordpress.com/36/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/anlai.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/anlai.wordpress.com/36/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/anlai.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/anlai.wordpress.com/36/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/anlai.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/anlai.wordpress.com/36/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=anlai.wordpress.com&amp;blog=12134941&amp;post=36&amp;subd=anlai&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://anlai.wordpress.com/2010/04/22/configuring-team-foundation-server-for-small-groups/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2fba155f9b45f2372dfcea40849c68a6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">anlai</media:title>
		</media:content>

		<media:content url="http://anlai.files.wordpress.com/2010/04/tfsadminconsole1_thumb.png" medium="image">
			<media:title type="html">tfs-adminconsole1</media:title>
		</media:content>

		<media:content url="http://anlai.files.wordpress.com/2010/04/tfsadminconsole2_thumb.png" medium="image">
			<media:title type="html">tfs-adminconsole2</media:title>
		</media:content>

		<media:content url="http://anlai.files.wordpress.com/2010/04/reportingservices1_thumb.png" medium="image">
			<media:title type="html">reportingservices1</media:title>
		</media:content>
	</item>
		<item>
		<title>Safely Displaying Html Formatted User Content</title>
		<link>http://anlai.wordpress.com/2010/03/31/safely-displaying-html-formatted-user-content/</link>
		<comments>http://anlai.wordpress.com/2010/03/31/safely-displaying-html-formatted-user-content/#comments</comments>
		<pubDate>Wed, 31 Mar 2010 14:35:06 +0000</pubDate>
		<dc:creator>anlai</dc:creator>
				<category><![CDATA[Asp.net]]></category>
		<category><![CDATA[Asp.net C#]]></category>
		<category><![CDATA[Asp.Net MVC]]></category>

		<guid isPermaLink="false">http://anlai.wordpress.com/2010/03/31/safely-displaying-html-formatted-user-content/</guid>
		<description><![CDATA[Html escaping in ASP.NET MVC is a great way to prevent Cross-Site Scripting (XSS) attacks on your application.  The only problem I found was that sometimes an application needs to display formatted text and using the “Html.Encode(content)” will remove all formatting (as it is expected to). So I have written a little extension method that [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=anlai.wordpress.com&amp;blog=12134941&amp;post=19&amp;subd=anlai&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Html escaping in ASP.NET MVC is a great way to prevent Cross-Site Scripting (XSS) attacks on your application.  The only problem I found was that sometimes an application needs to display formatted text and using the “Html.Encode(content)” will remove all formatting (as it is expected to).</p>
<p>So I have written a little extension method that enables specific html formatting to be allowed while still escaping potentally dangerous html.</p>
<p><pre class="brush: csharp;">
public static class HtmlHelperExtensions
{
     private const string htmlTag = @&amp;quot;&amp;amp;lt;{0}&amp;amp;gt;&amp;quot;;

     public static string HtmlEncode(this HtmlHelper helper, string text)
     {
          // encode the string
          string encodedText = HttpUtility.HtmlEncode(text);

          // put the text in a string builder
          StringBuilder formattedEncodedText = new StringBuilder(encodedText);

          // replace the escaped characters with the correct strings to allow formatting
          // &amp;lt;p&amp;gt;
          formattedEncodedText.Replace(string.Format(htmlTag, @&amp;quot;p&amp;quot;), @&amp;quot;&amp;lt;p&amp;gt;&amp;quot;);
          // &amp;lt;/p&amp;gt;
          formattedEncodedText.Replace(string.Format(htmlTag, @&amp;quot;/p&amp;quot;), @&amp;quot;&amp;lt;/p&amp;gt;&amp;quot;);

          // &amp;lt;strong&amp;gt;
          formattedEncodedText.Replace(string.Format(htmlTag, @&amp;quot;strong&amp;quot;), @&amp;quot;&amp;lt;strong&amp;gt;&amp;quot;);
          // &amp;lt;/strong&amp;gt;
          formattedEncodedText.Replace(string.Format(htmlTag, @&amp;quot;/strong&amp;quot;), @&amp;quot;&amp;lt;/strong&amp;gt;&amp;quot;);

          // &amp;lt;em&amp;gt;
          formattedEncodedText.Replace(string.Format(htmlTag, @&amp;quot;em&amp;quot;), @&amp;quot;&amp;lt;em&amp;gt;&amp;quot;);
          // &amp;lt;/em&amp;gt;
          formattedEncodedText.Replace(string.Format(htmlTag, @&amp;quot;/em&amp;quot;), @&amp;quot;&amp;lt;em&amp;gt;&amp;quot;);

          // &amp;lt;span style=&amp;quot;text-decoration:underline;&amp;quot;&amp;gt;
          string underline = @&amp;quot;&amp;amp;lt;span style=&amp;amp;quot;text-decoration: underline;&amp;amp;quot;&amp;amp;gt;&amp;quot;;
          string underlineReplacement = @&amp;quot;&amp;lt;span style=&amp;quot;&amp;quot;text-decoration:underline;&amp;quot;&amp;quot;&amp;gt;&amp;quot;;
          formattedEncodedText.Replace(underline, underlineReplacement);

          // &amp;lt;/span&amp;gt;
          // only find the spans that are related to the span for underlining
          var temp = formattedEncodedText.ToString();
          // for each instance of underline
          foreach (int i in temp.IndexOfAll(underlineReplacement))
          {
               // find the first instance of &amp;lt;/span&amp;gt; after the underline span and replace
               var index = temp.IndexOf(string.Format(htmlTag, @&amp;quot;/span&amp;quot;), i);

               // delete the string at that location
               temp = temp.Remove(index, string.Format(htmlTag, @&amp;quot;/span&amp;quot;).Length);

               // add in the new string at that location
               temp = temp.Insert(index, @&amp;quot;&amp;lt;/span&amp;gt;&amp;quot;);
          }

          formattedEncodedText = new StringBuilder(temp);

          // &amp;lt;ul&amp;gt;
          formattedEncodedText.Replace(string.Format(htmlTag, @&amp;quot;ul&amp;quot;), @&amp;quot;&amp;lt;ul&amp;gt;&amp;quot;);
          // &amp;lt;/ul&amp;gt;
          formattedEncodedText.Replace(string.Format(htmlTag, @&amp;quot;/ul&amp;quot;), @&amp;quot;&amp;lt;/ul&amp;gt;&amp;quot;);

          // &amp;lt;ol&amp;gt;
          formattedEncodedText.Replace(string.Format(htmlTag, @&amp;quot;ol&amp;quot;), @&amp;quot;&amp;lt;ol&amp;gt;&amp;quot;);
          // &amp;lt;/ol&amp;gt;
          formattedEncodedText.Replace(string.Format(htmlTag, @&amp;quot;/ol&amp;quot;), @&amp;quot;&amp;lt;/ol&amp;gt;&amp;quot;);

          // &amp;lt;li&amp;gt;
         formattedEncodedText.Replace(string.Format(htmlTag, @&amp;quot;li&amp;quot;), @&amp;quot;&amp;lt;li&amp;gt;&amp;quot;);
         // &amp;lt;/li&amp;gt;
         formattedEncodedText.Replace(string.Format(htmlTag, @&amp;quot;/li&amp;quot;), @&amp;quot;&amp;lt;/li&amp;gt;&amp;quot;);

         formattedEncodedText.Replace(@&amp;quot;&amp;amp;amp;nbsp;&amp;quot;, @&amp;quot;&amp;amp;nbsp;&amp;quot;);

         return formattedEncodedText.ToString();
     }
}
</pre></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/anlai.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/anlai.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/anlai.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/anlai.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/anlai.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/anlai.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/anlai.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/anlai.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/anlai.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/anlai.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/anlai.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/anlai.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/anlai.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/anlai.wordpress.com/19/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=anlai.wordpress.com&amp;blog=12134941&amp;post=19&amp;subd=anlai&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://anlai.wordpress.com/2010/03/31/safely-displaying-html-formatted-user-content/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2fba155f9b45f2372dfcea40849c68a6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">anlai</media:title>
		</media:content>
	</item>
		<item>
		<title>Shortening Open Id &amp; Asp.net MVC</title>
		<link>http://anlai.wordpress.com/2010/03/05/simplifying-open-id-asp-net-mvc/</link>
		<comments>http://anlai.wordpress.com/2010/03/05/simplifying-open-id-asp-net-mvc/#comments</comments>
		<pubDate>Fri, 05 Mar 2010 22:11:51 +0000</pubDate>
		<dc:creator>anlai</dc:creator>
				<category><![CDATA[Asp.net]]></category>
		<category><![CDATA[Asp.Net MVC]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[OpenId]]></category>

		<guid isPermaLink="false">http://anlai.wordpress.com/2010/03/05/simplifying-open-id-asp-net-mvc/</guid>
		<description><![CDATA[I’ve been working on a project that uses Open Id as the authentication method for public users.  I decided to use the DotNetOpenAuth provider to handle a lot of the grunt work for authentication.  The provider does a lot to simplify the process, but I wanted to make it shorter so I wrote a wrapper [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=anlai.wordpress.com&amp;blog=12134941&amp;post=4&amp;subd=anlai&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I’ve been working on a project that uses Open Id as the authentication method for public users.  I decided to use the <a href="http://www.dotnetopenauth.net/">DotNetOpenAuth</a> provider to handle a lot of the grunt work for authentication.  The provider does a lot to simplify the process, but I wanted to make it shorter so I wrote a wrapper around the DotNetOpenAuth code.</p>
<p>You can find the example provided by DotNetOpenAuth for Asp.net MVC <a href="http://www.dotnetopenauth.net/developers/code-snippets/programmatic-openid-relying-party/">here</a>. I am using version 3.4.1, so things may change but hopefully not in a newer version.</p>
<h3>Requesting Authentication from OpenId Provider</h3>
<p>To submit a request to authenticate all you need is the below code.  The first line builds a claims request to ask the Open Id provider for some pieces of information.  In my example below I am only asking for the user’s email address.  The second line handles making the request and redirecting the user to the provider for authentication.</p>
<p><pre class="brush: csharp;">
var claimsRequest = OpenIdHelper.CreateClaimsRequest(OpenIdHelper.RequestInformation.Email);
returnOpenIdHelper.Login(openid_identifier, claimsRequest);
</pre></p>
<h3>Validating Authentication from OpenId Provider</h3>
<p>To validate a request is even easier,  the OpenIdHelper has a ValidateResponse function that will return true if the user is valid or false if not.  If the user is valid the oepnIdUser parameter will be populated with the user’s information.  If there was an error the message parameter will contain the error message to do with what you please.</p>
<div class="csharpcode"><pre class="brush: csharp;">
Authentication.OpenIdUser openIdUser;
string message;

if (OpenIdHelper.ValidateResponse(out openIdUser, out message))
{
    // do some work
}

</pre></p>
<p>The below class is what is returned in the first parameter.</p>
</div>
<div class="csharpcode"><pre class="brush: csharp;">
public class OpenIdUser
{
 /// &lt;summary&gt;
 /// Essentially the userid
 /// &lt;/summary&gt;
 public string ClaimedIdentifier { get; set; }

 public DateTime? Birthdate { get; set; }
 public string Country { get; set; }
 public string Email { get; set; }
 public string FullName { get; set; }
 public string Gender { get; set; }
 public string Language { get; set; }
 public string Nickname { get; set; }
 public string PostalCode { get; set; }
 public string TimeZone { get; set; }
}
</pre></p>
</div>
<p>Putting it together I have the following actions in my account controller.</p>
<div class="csharpcode"><pre class="brush: csharp;">
[AcceptPost]
 public ActionResult Authenticate(string openid_identifier)
 {
 var claimsRequest = OpenIdHelper.CreateClaimsRequest(OpenIdHelper.RequestInformation.Email);
 return OpenIdHelper.Login(openid_identifier, claimsRequest);
 }

 /// &lt;summary&gt;
 /// Response from OpenId provider telling is user is authentic or not
 /// &lt;/summary&gt;
 /// &lt;param name=&quot;returnUrl&quot;&gt;&lt;/param&gt;
 /// &lt;returns&gt;&lt;/returns&gt;
 [ValidateInput(false)]
 public ActionResult Authenticate()
 {
 Authentication.OpenIdUser openIdUser;
 string message;

 if (OpenIdHelper.ValidateResponse(out openIdUser, out message))
     {
          // do some work
     }
 }
</pre></p>
</div>
<p>My OpenIdHelper can be downloaded at <a href="http://gist.github.com/323195">http://gist.github.com/323195</a></p>
<h3>OpenId Provider Selector</h3>
<p>It’s really a matter of preference but I picked the <a href="http://code.google.com/p/openid-selector/">OpenId Selector</a>.  I chose it because it’s simple to use.</p>
<p><pre class="brush: xml;">

&lt;%@ Page Title=&quot;&quot; Language=&quot;C#&quot; MasterPageFile=&quot;~/Views/Shared/Site.Master&quot; Inherits=&quot;System.Web.Mvc.ViewPage&quot; %&gt;

&lt;asp:Content ID=&quot;Content1&quot; ContentPlaceHolderID=&quot;TitleContent&quot; runat=&quot;server&quot;&gt;
 LogOn
&lt;/asp:Content&gt;
&lt;asp:Content ID=&quot;Content3&quot; ContentPlaceHolderID=&quot;HeaderContent&quot;  runat=&quot;server&quot;&gt;
 &lt;link href=&quot;../../Content/openid.css&quot; rel=&quot;stylesheet&quot;  type=&quot;text/css&quot; /&gt;
 &lt;script src=&quot;../../Scripts/openid-jquery.js&quot;  type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
 &lt;script type=&quot;text/javascript&quot;&gt;
 $(document).ready(function() {
 openid.init('openid_identifier');
 });
 &lt;/script&gt;
 &lt;/asp:Content&gt;
&lt;asp:Content ID=&quot;Content2&quot; ContentPlaceHolderID=&quot;MainContent&quot; runat=&quot;server&quot;&gt;

&lt;!-- Simple OpenID Selector --&gt;
&lt;% using (Html.BeginForm(&quot;Authenticate&quot;, &quot;Account&quot;, FormMethod.Post, new { @id = &quot;openid_form&quot; }))
 { %&gt;

 &lt;input type=&quot;hidden&quot; name=&quot;action&quot; value=&quot;verify&quot; /&gt;

 &lt;fieldset&gt;
 &lt;legend&gt;Sign-in or Create New Account&lt;/legend&gt;

 &lt;div id=&quot;openid_choice&quot;&gt;
 &lt;p&gt;Please click your account provider:&lt;/p&gt;
 &lt;div id=&quot;openid_btns&quot;&gt;&lt;/div&gt;
 &lt;/div&gt;

 &lt;div id=&quot;openid_input_area&quot;&gt;
 &lt;input id=&quot;openid_identifier&quot; name=&quot;openid_identifier&quot; type=&quot;text&quot; value=&quot;http://&quot; /&gt;
 &lt;input id=&quot;openid_submit&quot; type=&quot;submit&quot; value=&quot;Sign-In&quot;/&gt;
 &lt;/div&gt;
 &lt;noscript&gt;
 &lt;p&gt;OpenID is service that allows you to log-on to many different websites using a single indentity.
 Find out &lt;a href=&quot;http://openid.net/what/&quot;&gt;more about OpenID&lt;/a&gt; and &lt;a href=&quot;http://openid.net/get/&quot;&gt;how to get an OpenID enabled account&lt;/a&gt;.&lt;/p&gt;
 &lt;/noscript&gt;
 &lt;/fieldset&gt;

&lt;% } %&gt;

&lt;/asp:Content&gt;

</pre></p>
<p>It could just be me, but I had a strange problem with the plug-in and had to make a minor change to get it to function properly.  In the situation where I have previously selected an OpenId provider, the next time I come to the page and try to select a different provider it still goes to the original provider that was selected.</p>
<p>In the openid-jquery.js plug-in, I had to change line 169 in the setOpenIdUrl function from :</p>
<p><pre class="brush: jscript;">
hidden.value = url;
</pre></p>
<p>to</p>
<p><pre class="brush: jscript;">
$(hidden).val(url);
</pre></p>
<p>Well that’s all I got for my first post, hope it’s at least somewhat useful to someone other than me.  Any feedback or suggestions would be appreciated.</p>
<div id="_mcePaste" style="position:absolute;left:-10000px;top:1936px;width:1px;height:1px;overflow:hidden;">In the openid-jquery.js plug-in, I had to change line 169 in the  setOpenIdUrl function from :</div>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/anlai.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/anlai.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/anlai.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/anlai.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/anlai.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/anlai.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/anlai.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/anlai.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/anlai.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/anlai.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/anlai.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/anlai.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/anlai.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/anlai.wordpress.com/4/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=anlai.wordpress.com&amp;blog=12134941&amp;post=4&amp;subd=anlai&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://anlai.wordpress.com/2010/03/05/simplifying-open-id-asp-net-mvc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2fba155f9b45f2372dfcea40849c68a6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">anlai</media:title>
		</media:content>
	</item>
	</channel>
</rss>
