<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><description>Ex-Microsoft developer turned consultant. While at Microsoft, I shipped 3 products, MIIS SP2, ILM 2007, &amp; FIM 2010. I also worked on the Windows Server Active Directory team, working on Windows Server v.Next!
In my spare time, I like to breakdance, photograph clothes, and continue research in VFX rendering algorithms. 
Feel free to get in touch with me by clicking the link below or emailing me at contact ‘at’ aesthetixsoftware.com</description><title>Identity Management through FIM</title><generator>Tumblr (3.0; @aesthsoft)</generator><link>http://blog.aesthetixsoftware.com/</link><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/aesthsoft" /><feedburner:info uri="aesthsoft" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://tumblr.superfeedr.com/" /><item><title>Sharepoint editing for FIM Portal</title><description>&lt;p&gt;&lt;span&gt;Useful tidbit: &lt;/span&gt;&lt;/p&gt;
&lt;h3 class="post-title entry-title"&gt;&amp;#8220;Editing Files in a WSP&lt;/h3&gt;
&lt;p&gt;Sometimes you don&amp;#8217;t have the Visual Studio project handy for a wsp&amp;#8212;but you want to change something (settings, etc). I can remember trying this a while back and finding it tedious&amp;#8212;having to resort to makecab and the like. The need came up again so I figured it was worth a search to see if anything had changed, and behold, there is an easier way now. Thanks to &lt;a href="http://sharepointroot.com/2010/07/07/editing-contents-of-a-wsp-sharepoint/"&gt;Grumpy Wookie&lt;/a&gt; for posting about a nice archiving utility, IZArc, and how to use it to edit wsp&amp;#8217;s. I found a slightly simpler process. The steps are basically:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Rename the WSP to CAB&lt;/li&gt;
&lt;li&gt;Extract the wsp to a folder&lt;/li&gt;
&lt;li&gt;Edit the extracted files as needed&lt;/li&gt;
&lt;li&gt;Select all the files in extracted folder (Ctrl-A) and create a &lt;span&gt;zip&lt;/span&gt; archive (this avoids the problem Grumpy Wookie ran into with IZArc not handling subfolders)&lt;/li&gt;
&lt;li&gt;Open the zip in IZArc and do Tools &amp;gt; Convert Archive and select Cabinet (.cab) as the Output Type to create it as a CAB&lt;/li&gt;
&lt;li&gt;Edit the created cab file to change it back to a wsp&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;You can download IZArc from &lt;a href="http://download.cnet.com/IZArc/3000-2250_4-10072925.html"&gt;CNet&lt;/a&gt;.&amp;#8221;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/aesthsoft/~4/7rW8oV_RUlI" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/aesthsoft/~3/7rW8oV_RUlI/20070922367</link><guid isPermaLink="false">http://blog.aesthetixsoftware.com/post/20070922367</guid><pubDate>Wed, 28 Mar 2012 11:46:44 -0700</pubDate><feedburner:origLink>http://blog.aesthetixsoftware.com/post/20070922367</feedburner:origLink></item><item><title>Hi Ikrima. Can you offer some advice on a workflow question I have been considering. I'd like to be able to have a workflow wait for an event. So a user gets created but it waits for the objectSid to come back into the portal before sending the notification. It would seem to be simpler if all done in the one WF so I can send the random password in the email, without having to write it onto the user object. The alternative is to muck around with sets like "Created and waiting confirmation" and "Created and confirmed". So I guess the questions are:&lt;br /&gt;&#xD;
- Is it ok to write an activity that does some kind of wait loop, or is it a dumb idea? I realise that if the FIM service went down the activity would be terminated.&lt;br /&gt;&#xD;
- Clearly the Approval activity is doing asically what  want. Is there any way to tap into what it does?&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
TIA. And - are you still in Prague?&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
Carol</title><description>&lt;p&gt;Hey Carol,&lt;/p&gt;
&lt;p&gt;I just hit this same problem recently. The solution you’re looking for is a delay activity (it’s provided OOB by windows workflow http://msdn.microsoft.com/en-us/library/system.workflow.activities.delayactivity(v=VS.90).aspx).&lt;/p&gt;
&lt;p&gt;What you can do is create a custom workflow activity that polls the object you’re looking for.  Why not use a for-loop in code? Well that would burn CPU cycles. You should also not just call thread.sleep() since it’ll basically do the same thing and block other workflows from executing.&lt;/p&gt;
&lt;p&gt;Using the delay activity handles all the annoying details of sending the workflow to the DB and bringing it back up for execution after the specified delay.  In the mean time, other workflows can execute.&lt;/p&gt;
&lt;p&gt;So, what you can do is&gt;&lt;/p&gt;
&lt;p&gt;while activity (numberOfTries &lt; 3 || accountIsFound == true)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;Code activity { check to see if account exists in AD. }&lt;/p&gt;
&lt;p&gt;If-Activity (accountIsFound == false)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;DelayActivity ( preconfiguredTimeToWaitBeforeRetry)&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;The Approval activity uses the same mechanism that the delay activity uses (the workflow guys call it passivating &amp; hydrating) although through a different channel: instead of waiting on some specified time, the workflow waits indefinitely in the DB until a client connects to it.&lt;/p&gt;
&lt;p&gt;Let me know if that helps!&lt;/p&gt;
&lt;p&gt;And yup, I’m still out here in Prague enjoying Europe&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/aesthsoft/~4/4xDz5x8poO8" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/aesthsoft/~3/4xDz5x8poO8/8358642057</link><guid isPermaLink="false">http://blog.aesthetixsoftware.com/post/8358642057</guid><pubDate>Mon, 01 Aug 2011 16:09:49 -0700</pubDate><feedburner:origLink>http://blog.aesthetixsoftware.com/post/8358642057</feedburner:origLink></item><item><title>Make .Net assemblies easier to debug</title><description>&lt;p&gt;Those .Net DLLs you have are compiled into something called byte-code (aka MSIL).  This is kind of like a more machine readable version of your code, but it can&amp;#8217;t be run directly by your computer.&lt;/p&gt;
&lt;p&gt;Instead, there&amp;#8217;s a program (referred to as a virtual machine and in .net, it&amp;#8217;s the .Net CLR) that compiles this bytecode dll into a native image format (this is called just in time compiling aka JITing).&lt;/p&gt;
&lt;p&gt;Why does all of this matter to us? Well, if you&amp;#8217;re using reflector &amp;amp; trying to debug some cod ewhere you don&amp;#8217;t have any source code, you may find it precompile a non-optimized version of the bytecode dll.&lt;/p&gt;
&lt;p&gt;You can do this with NGEN (&lt;a href="http://msdn.microsoft.com/en-us/library/6t9t5wcf(v=VS.100).aspx"&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/6t9t5wcf"&gt;http://msdn.microsoft.com/en-us/library/6t9t5wcf&lt;/a&gt;(v=VS.100).aspx&lt;/a&gt;) and by defining these flags in the .ini config file&lt;/p&gt;
&lt;pre&gt;[.NET Framework Debugging Control]
GenerateTrackingInfo=1
AllowOptimize=0&lt;/pre&gt;&lt;img src="http://feeds.feedburner.com/~r/aesthsoft/~4/evfVSK9dnhI" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/aesthsoft/~3/evfVSK9dnhI/6003599316</link><guid isPermaLink="false">http://blog.aesthetixsoftware.com/post/6003599316</guid><pubDate>Mon, 30 May 2011 09:08:00 -0700</pubDate><category>.net</category><category>debugging</category><category>jit</category><feedburner:origLink>http://blog.aesthetixsoftware.com/post/6003599316</feedburner:origLink></item><item><title>Foundations: ActivityExecutionContext in Workflows</title><description>&lt;a href="http://msdn.microsoft.com/en-us/magazine/cc163414.aspx"&gt;Foundations: ActivityExecutionContext in Workflows&lt;/a&gt;: &lt;p&gt;The answer to “Why doesn’t my FIM Workflow Activity work inside of a loop?”&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/aesthsoft/~4/-0Hlck6tTy4" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/aesthsoft/~3/-0Hlck6tTy4/5370315721</link><guid isPermaLink="false">http://blog.aesthetixsoftware.com/post/5370315721</guid><pubDate>Tue, 10 May 2011 14:30:06 -0700</pubDate><category>fim</category><category>workflow</category><category>activity</category><category>debug</category><feedburner:origLink>http://blog.aesthetixsoftware.com/post/5370315721</feedburner:origLink></item><item><title>Correct syntax for case insensitive regular expressions in RCDC</title><description>&lt;p&gt;Just noticed the documentation was incorrect for the RCDC in FIM.  Here&amp;#8217;s what it hsould be &lt;/p&gt;

&lt;p&gt;&lt;span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;h3 class="subHeading"&gt;Making regular expressions case insensitive&lt;/h3&gt;
&lt;p&gt;In FIM 2010, it can be helpful to make some regular expressions case insensitive. You can ignore case within a group by using &lt;strong&gt;?!:&lt;/strong&gt;. For example, for &lt;strong&gt;Employee Type&lt;/strong&gt;, use the following:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;^(&lt;strong&gt;?i&lt;/strong&gt;:contractor|full time employee)&lt;strong&gt;$&lt;/strong&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The incorrect version was &lt;span&gt;^(&lt;strong&gt;?!&lt;/strong&gt;:contractor|full time employee)&lt;strong&gt;%&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/aesthsoft/~4/RuuYJ7JBpMs" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/aesthsoft/~3/RuuYJ7JBpMs/5334547717</link><guid isPermaLink="false">http://blog.aesthetixsoftware.com/post/5334547717</guid><pubDate>Mon, 09 May 2011 07:24:03 -0700</pubDate><category>fim</category><category>rcdc</category><category>case insensitive</category><category>regular expression</category><feedburner:origLink>http://blog.aesthetixsoftware.com/post/5334547717</feedburner:origLink></item><item><title>FIM: Kick Off AuthN/AuthZ from within activities</title><description>&lt;p&gt;&lt;span&gt;&lt;span&gt;I thought I posted the follow up but must&amp;#8217;ve got sidetracked.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;strong&gt;Scenario:&lt;/strong&gt;&lt;br/&gt;User John does an update request on John.Manager =&amp;gt; launches authorization workflow, which uses the public client to create a request to the middle tier on John&amp;#8217;s behalf?&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;If you enable delegation on your public proxy WCF bindings, you can in your activities impersonate the user credentials with this call:&lt;br/&gt;&lt;/span&gt;&lt;span&gt;(actually, you may only need to be impersonation since you&amp;#8217;re impersonated call never leaves the box to talk to the fim service)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;ServiceSecurityContext.Current.WindowsIdentity.Impersonate();&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Then, if you use the public client in your code to make calls to the fim service, you will be under that user&amp;#8217;s credentials and can kick off other necessary MPRs.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;Couple of salient points:&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;1. All code that follows that impersonation call will be under the users credentials. Makes sense right? So what happens if you have a create activity or an update activity in your workflow? It fails b/c that thread is under the user context so any connections to the sql fim store to run any sprocs will fail b/c that user doesn&amp;#8217;t have access to the DB.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;2. ServiceSecurityContext is backed by a [ThreadStatic] attribute. ThreadStatic means an variable is scoped only to the current thread. Which means if you fork a new thread, that context is lost. So why does this matter to us? Well, when workflows passivate or get persisted to the DB (ex: when an activity is waiting on input from an approver), that context gets lost. So when your code comes back up, you no longer have access to ServiceSecurityContext.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;3. If you&amp;#8217;re under the impersonated context when the workflow passivates&amp;#8230;.wild things may happen. Haven&amp;#8217;t tested it.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;4. You no longer have parenting of requests. There are no longer chains of requests so if you cancel a parent request, the new request you spawned may&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;5. You have to handle the logic of how to wait on the new request you just spawned: does your activity proceed if there&amp;#8217;s an authz workflow kicked off? Does it wait on the input? What if there&amp;#8217;s an authn workflow? Does it handle the child requests interactive action workflows? Yup, it&amp;#8217;s very nasty and hairy to solve in the general case (there is a reason why the FIM team doesn&amp;#8217;t have this enabled by default)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;Here&amp;#8217;s what I would suggest (haven&amp;#8217;t had time to fully explore this, just used this to implement delegation as a proof of concept):&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;1. Store the WindowsIdentity locally when overriding OnActivityExecutionLoad&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;2. Have very simple defined cases of when you kick off requests that spawn new AuthZ workflows. Don&amp;#8217;t try to solve the general case. Any case that requires chainign of requests =&amp;gt; pain&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;3. Keep the impersonation scope very limited and defined:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;using(ServiceSecurityContext.Current.WindowsIdentity.Impersonate())&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;{&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;//Code to call public client to talk to FIM service&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;}//Impersonation is always reverted this way&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;4. For auditing/reporting, the child request that gets created this way will have the user as the actorID. Just be aware.&lt;/span&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/aesthsoft/~4/0nu12rW83SY" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/aesthsoft/~3/0nu12rW83SY/5214300054</link><guid isPermaLink="false">http://blog.aesthetixsoftware.com/post/5214300054</guid><pubDate>Thu, 05 May 2011 01:45:00 -0700</pubDate><category>FIM</category><category>Delegation</category><category>activities</category><category>authz</category><feedburner:origLink>http://blog.aesthetixsoftware.com/post/5214300054</feedburner:origLink></item><item><title>Test your knowledge of C#</title><description>&lt;p&gt;&lt;span&gt;&lt;a href="http://stackoverflow.com/questions/1260227/int-arr0-int-value-arrarr0-value-1"&gt;int[] arr={0}; int value = arr[arr[0]++]; Value = &lt;/a&gt;?&lt;/span&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/aesthsoft/~4/9Y-oj1VXlLU" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/aesthsoft/~3/9Y-oj1VXlLU/5214232365</link><guid isPermaLink="false">http://blog.aesthetixsoftware.com/post/5214232365</guid><pubDate>Thu, 05 May 2011 01:38:30 -0700</pubDate><feedburner:origLink>http://blog.aesthetixsoftware.com/post/5214232365</feedburner:origLink></item><item><title>.Net Threading Model: Re-entrancy stumbling block</title><description>&lt;p&gt;&lt;span&gt;
&lt;h3 class="subHeading"&gt;.NET Reentrancy and Locking&lt;/h3&gt;
&lt;p&gt;The locking mechanism of the common language runtime (CLR) doesn’t behave exactly as one might imagine; one might expect a thread to cease operation completely when requesting a lock. In actuality, the thread continues to receive and process high-priority messages. This helps prevent deadlocks and make interfaces minimally responsive, but it introduces the possibility for subtle bugs.  The vast majority of the time you don’t need to know anything about this, but under rare circumstances (usually involving Win32 window messages or COM STA components) this can be worth knowing.&lt;/p&gt;
&lt;h3 class="subHeading"&gt;How It Relates to WPF&lt;/h3&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Most interfaces are not built with thread safety in mind because developers work under the assumption that a UI is never accessed by more than one thread. In this case, that single thread may make environmental changes at unexpected times, causing those ill effects that the &lt;span&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcherobject.aspx"&gt;DispatcherObject&lt;/a&gt;&lt;/span&gt; mutual exclusion mechanism is supposed to solve. Consider the following pseudocode:&lt;/p&gt;
&lt;img title="Threading reentrancy diagram" src="http://i.msdn.microsoft.com/dynimg/IC48486.png" alt="Threading reentrancy diagram" id="ThreadingReentrancy"/&gt;&lt;p&gt;Most of the time that’s the right thing, but there are times in WPF where such unexpected reentrancy can really cause problems. So, at certain key times, WPF calls &lt;span&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcher.disableprocessing.aspx"&gt;DisableProcessing&lt;/a&gt;&lt;/span&gt;, which changes the lock instruction for that thread to use the WPF reentrancy-free lock, instead of the usual CLR lock. &lt;/p&gt;
&lt;p&gt;So why did the CLR team choose this behavior? It had to do with COM STA objects and the finalization thread. &lt;em&gt;When an object is garbage collected, its &lt;span class="input"&gt;Finalize&lt;/span&gt; method is run on the dedicated finalizer thread, not the UI thread&lt;/em&gt;. And therein lies the problem, because a COM STA object that was created on the UI thread can only be disposed on the UI thread. The CLR does the equivalent of a &lt;span&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcher.begininvoke.aspx"&gt;BeginInvoke&lt;/a&gt;&lt;/span&gt; (in this case using Win32’s &lt;strong&gt;SendMessage&lt;/strong&gt;). But if the UI thread is busy, the finalizer thread is stalled and the COM STA object can’t be disposed, which creates a serious memory leak. So the CLR team made the tough call to make locks work the way they do.  &lt;/p&gt;
&lt;p&gt;The task for WPF is to avoid unexpected reentrancy without reintroducing the memory leak, which is why we don’t block reentrancy everywhere.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/aesthsoft/~4/gerWAlv_V1A" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/aesthsoft/~3/gerWAlv_V1A/5186425413</link><guid isPermaLink="false">http://blog.aesthetixsoftware.com/post/5186425413</guid><pubDate>Wed, 04 May 2011 03:02:43 -0700</pubDate><category>wpf</category><category>.net</category><category>c sharp</category><category>threading model</category><category>reentrancy</category><category>locking</category><feedburner:origLink>http://blog.aesthetixsoftware.com/post/5186425413</feedburner:origLink></item><item><title>MIIS/FIM Sync Terms</title><description>&lt;p&gt;5 years later and I still can&amp;#8217;t keep all the MIIS Terms straight.  I always end up hunting for this graphic:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_lkkad8sQCi1qchdzl.gif"/&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/aesthsoft/~4/8ZiZOGmbTr8" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/aesthsoft/~3/8ZiZOGmbTr8/5128272973</link><guid isPermaLink="false">http://blog.aesthetixsoftware.com/post/5128272973</guid><pubDate>Mon, 02 May 2011 02:30:02 -0700</pubDate><category>MIIS</category><category>FIM Sync</category><feedburner:origLink>http://blog.aesthetixsoftware.com/post/5128272973</feedburner:origLink></item><item><title>Turning On FIM/WCF Tracing</title><description>&lt;p&gt;First, let it be known that I hate xml config files.  It&amp;#8217;s a pain in the ass to write a script to modify certain portions of it&amp;#8230;like when I want to turn off or turn on tracing in the FIM portal or the RMS.  So I usually resort it to doing it by hand&amp;#8230;.which is terrible because I always forget small details.&lt;/p&gt;
&lt;p&gt;Like why is message logging not happening? Oh yeah.  Have to add this tag:&lt;/p&gt;
&lt;p&gt;&amp;lt;system.serviceModel&amp;gt;&lt;/p&gt;
&lt;p&gt;    &amp;lt;diagnostics wmiProviderEnabled=&amp;#8221;true&amp;#8221;&amp;gt;&lt;/p&gt;
&lt;p&gt;        &amp;lt;messageLogging &lt;/p&gt;
&lt;p&gt;             logEntireMessage=&amp;#8221;true&amp;#8221; &lt;/p&gt;
&lt;p&gt;             logMalformedMessages=&amp;#8221;true&amp;#8221;&lt;/p&gt;
&lt;p&gt;             logMessagesAtServiceLevel=&amp;#8221;true&amp;#8221; &lt;/p&gt;
&lt;p&gt;             logMessagesAtTransportLevel=&amp;#8221;true&amp;#8221;&lt;/p&gt;
&lt;p&gt;             maxMessagesToLog=&amp;#8221;3000&amp;#8221; &lt;/p&gt;
&lt;p&gt;         /&amp;gt;&lt;/p&gt;
&lt;p&gt;    &amp;lt;/diagnostics&amp;gt;&lt;/p&gt;
&lt;p&gt;    &amp;lt;behaviors&amp;gt;&lt;/p&gt;
&lt;p&gt;       &amp;lt;serviceBehaviors&amp;gt;&lt;/p&gt;
&lt;p&gt;          &amp;lt;behavior name=&amp;#8221;Default&amp;#8221;&amp;gt;&lt;/p&gt;
&lt;p&gt;             &amp;lt;serviceDebug includeExceptionDetailInFaults=&amp;#8221;true&amp;#8221;/&amp;gt;&lt;/p&gt;
&lt;p&gt;            &amp;lt;/behavior&amp;gt;&lt;/p&gt;
&lt;p&gt;        &amp;lt;/serviceBehaviors&amp;gt;&lt;/p&gt;
&lt;p&gt;    &amp;lt;/behaviors&amp;gt;&lt;/p&gt;
&lt;p&gt;  &amp;lt;/system.serviceModel&amp;gt;&lt;/p&gt;
&lt;p&gt;  &amp;lt;system.diagnostics&amp;gt; &lt;/p&gt;
&lt;p&gt;    &amp;lt;sources&amp;gt; &lt;/p&gt;
&lt;p&gt;      &amp;lt;source name=&amp;#8221;System.ServiceModel.MessageLogging&amp;#8221; switchValue=&amp;#8221;Verbose,ActivityTracing&amp;#8221;&amp;gt; &lt;/p&gt;
&lt;p&gt;        &amp;lt;listeners&amp;gt; &lt;/p&gt;
&lt;p&gt;          &amp;lt;add type=&amp;#8221;System.Diagnostics.DefaultTraceListener&amp;#8221; name=&amp;#8221;Default&amp;#8221;&amp;gt; &lt;/p&gt;
&lt;p&gt;            &amp;lt;filter type=&amp;#8221;&amp;#8221; /&amp;gt; &lt;/p&gt;
&lt;p&gt;          &amp;lt;/add&amp;gt;&lt;/p&gt;
&lt;p&gt;          &amp;lt;add name=&amp;#8221;DiagnosticListener&amp;#8221;&amp;gt; &lt;/p&gt;
&lt;p&gt;            &amp;lt;filter type=&amp;#8221;&amp;#8221; /&amp;gt; &lt;/p&gt;
&lt;p&gt;          &amp;lt;/add&amp;gt; &lt;/p&gt;
&lt;p&gt;        &amp;lt;/listeners&amp;gt; &lt;/p&gt;
&lt;p&gt;      &amp;lt;/source&amp;gt; &lt;/p&gt;
&lt;p&gt;      &amp;lt;source name=&amp;#8221;System.ServiceModel&amp;#8221; switchValue=&amp;#8221;Information,ActivityTracing&amp;#8221; propagateActivity=&amp;#8221;true&amp;#8221;&amp;gt; &lt;/p&gt;
&lt;p&gt;        &amp;lt;listeners&amp;gt; &lt;/p&gt;
&lt;p&gt;          &amp;lt;add type=&amp;#8221;System.Diagnostics.DefaultTraceListener&amp;#8221; name=&amp;#8221;Default&amp;#8221;&amp;gt; &lt;/p&gt;
&lt;p&gt;            &amp;lt;filter type=&amp;#8221;&amp;#8221; /&amp;gt; &lt;/p&gt;
&lt;p&gt;          &amp;lt;/add&amp;gt; &lt;/p&gt;
&lt;p&gt;          &amp;lt;add name=&amp;#8221;DiagnosticListener&amp;#8221;&amp;gt; &lt;/p&gt;
&lt;p&gt;            &amp;lt;filter type=&amp;#8221;&amp;#8221; /&amp;gt; &lt;/p&gt;
&lt;p&gt;          &amp;lt;/add&amp;gt; &lt;/p&gt;
&lt;p&gt;        &amp;lt;/listeners&amp;gt; &lt;/p&gt;
&lt;p&gt;      &amp;lt;/source&amp;gt;&lt;/p&gt;
&lt;p&gt;      &amp;lt;source name=&amp;#8221;Microsoft.ResourceManagement&amp;#8221; switchValue=&amp;#8221;Verbose,ActivityTracing&amp;#8221; propagateActivity=&amp;#8221;true&amp;#8221;&amp;gt;&lt;/p&gt;
&lt;p&gt;        &amp;lt;listeners&amp;gt;&lt;/p&gt;
&lt;p&gt;          &amp;lt;add type=&amp;#8221;System.Diagnostics.DefaultTraceListener&amp;#8221; name=&amp;#8221;Default&amp;#8221;&amp;gt;&lt;/p&gt;
&lt;p&gt;            &amp;lt;filter type=&amp;#8221;&amp;#8221; /&amp;gt;&lt;/p&gt;
&lt;p&gt;          &amp;lt;/add&amp;gt;&lt;/p&gt;
&lt;p&gt;          &amp;lt;add name=&amp;#8221;DiagnosticListener&amp;#8221;&amp;gt;&lt;/p&gt;
&lt;p&gt;            &amp;lt;filter type=&amp;#8221;&amp;#8221; /&amp;gt;&lt;/p&gt;
&lt;p&gt;          &amp;lt;/add&amp;gt;&lt;/p&gt;
&lt;p&gt;        &amp;lt;/listeners&amp;gt;&lt;/p&gt;
&lt;p&gt;      &amp;lt;/source&amp;gt;&lt;/p&gt;
&lt;p&gt;    &amp;lt;/sources&amp;gt; &lt;/p&gt;
&lt;p&gt;    &amp;lt;sharedListeners&amp;gt;&lt;/p&gt;
&lt;p&gt;      &amp;lt;add initializeData=&amp;#8221;C:\logs\FIMPortal.Client_tracelog.svclog&amp;#8221; type=&amp;#8221;System.Diagnostics.XmlWriterTraceListener, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089&amp;#8221;&lt;/p&gt;
&lt;p&gt;        name=&amp;#8221;DiagnosticListener&amp;#8221; traceOutputOptions=&amp;#8221;LogicalOperationStack, DateTime, Timestamp, ProcessId, ThreadId, Callstack&amp;#8221;&amp;gt;&lt;/p&gt;
&lt;p&gt;        &amp;lt;filter type=&amp;#8221;&amp;#8221; /&amp;gt;&lt;/p&gt;
&lt;p&gt;      &amp;lt;/add&amp;gt;&lt;/p&gt;
&lt;p&gt;    &amp;lt;/sharedListeners&amp;gt; &lt;/p&gt;
&lt;p&gt;    &amp;lt;trace autoflush=&amp;#8221;true&amp;#8221; /&amp;gt;  &lt;/p&gt;
&lt;p&gt;  &amp;lt;/system.diagnostics&amp;gt; &lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/aesthsoft/~4/Y3lk61Y7kD0" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/aesthsoft/~3/Y3lk61Y7kD0/5037294685</link><guid isPermaLink="false">http://blog.aesthetixsoftware.com/post/5037294685</guid><pubDate>Fri, 29 Apr 2011 02:45:00 -0700</pubDate><category>FIM</category><category>logging</category><category>tracing</category><category>wcf</category><feedburner:origLink>http://blog.aesthetixsoftware.com/post/5037294685</feedburner:origLink></item><item><title>Sample SMS OTP Authentication Activity for FIM</title><description>&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_lk2ffaZXjy1qchdzl.png"/&gt;&lt;/p&gt;

&lt;p&gt;I published all the source code for the OTP Demo I did over at TEC at &lt;a href="https://github.com/ikrima/Public-Development"&gt;&lt;a href="https://github.com/ikrima/Public-Development"&gt;https://github.com/ikrima/Public-Development&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The source code contains a sample password reset activity using the interactive activity, the SMS One Time Password Authentication activity, an aspx web app that allows you to perform web based password reset, and the necessary public client extensions that allow you to talk to interactive activities (it would be easy to extend it to communicate to the OOB Password Reset Activity)&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/aesthsoft/~4/eCqhYt_9NI0" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/aesthsoft/~3/eCqhYt_9NI0/4841026731</link><guid isPermaLink="false">http://blog.aesthetixsoftware.com/post/4841026731</guid><pubDate>Fri, 22 Apr 2011 11:06:00 -0700</pubDate><category>FIM</category><category>password reset</category><category>otp</category><category>one-time password</category><feedburner:origLink>http://blog.aesthetixsoftware.com/post/4841026731</feedburner:origLink></item><item><title>Speaking at TEC in vegas! What would you like a focus on?</title><description>&lt;p&gt;So I&amp;#8217;m speaking at The Experts Conference (&lt;a href="http://www.theexpertsconference.com/"&gt;TEC&lt;/a&gt;) this year in vegas.  I have two presentations and as I&amp;#8217;m wrapping up writing them, I realized that there&amp;#8217;s just way too much content for two one hour presentations.  So I carved out the important bits but I figured I&amp;#8217;d ask the interweb about the rest: what would you like an emphasis on?&lt;/p&gt;

&lt;p&gt;Presentation 1: How to write custom authentication activities in FIM (e.g. OTP)&lt;/p&gt;
&lt;p&gt;- Writing GINA Win32 UI (so your activity shows up in GINA)&lt;/p&gt;
&lt;p&gt;-Extending the public client to talk to authentication activities for password reset&lt;/p&gt;
&lt;p&gt;-Writing interactive activities (e.g. a non-password reset activity)&lt;/p&gt;

&lt;p&gt;Presentation 2: Delegation model in FIM&lt;/p&gt;
&lt;p&gt;- Which example should we work through: Approve on Behalf of vs. Password Reset on behalf of (It admin resets the password of another user)&lt;/p&gt;
&lt;p&gt;-Go into detail about extending the public client to talk to interactive activities&lt;/p&gt;
&lt;p&gt;-How to write activities invoke authorization workflows on the user&amp;#8217;s behalf (impersonation)&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/aesthsoft/~4/JVdfGPWWI_4" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/aesthsoft/~3/JVdfGPWWI_4/4420553887</link><guid isPermaLink="false">http://blog.aesthetixsoftware.com/post/4420553887</guid><pubDate>Thu, 07 Apr 2011 12:10:14 -0700</pubDate><category>FIM</category><category>TEC</category><category>The Experts Conference</category><category>Password Reset</category><category>Authentication</category><feedburner:origLink>http://blog.aesthetixsoftware.com/post/4420553887</feedburner:origLink></item><item><title>Can We Fix the Security Economics of Federated Authentication?</title><description>&lt;a href="http://spw.stca.herts.ac.uk/2.pdf"&gt;Can We Fix the Security Economics of Federated Authentication?&lt;/a&gt;: &lt;p&gt;A case study and interesting read&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/aesthsoft/~4/2xyjh9sWA0Y" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/aesthsoft/~3/2xyjh9sWA0Y/4183525539</link><guid isPermaLink="false">http://blog.aesthetixsoftware.com/post/4183525539</guid><pubDate>Tue, 29 Mar 2011 05:57:07 -0700</pubDate><feedburner:origLink>http://blog.aesthetixsoftware.com/post/4183525539</feedburner:origLink></item><item><title>Types of Load on FIM Service</title><description>&lt;p&gt;&lt;span&gt;
&lt;p&gt;The FIM webservice is multithreaded so each new client request has its own request and request state (SQL is the persistence store that&amp;#8217;s used).  So the number of active &amp;#8220;requests&amp;#8221; is limited to whatever your WCF configuration binding dictates (you can set maximum number of simultaneous TCP/IP connections, maximum timeout, maximum payload, etc etc etc). These configuration parameters dictate how many &lt;strong&gt;active connections&lt;/strong&gt; you have, as opposed to requests in the system.&lt;/p&gt;

&lt;p&gt;Now each request may spawn off AuthN, AuthZ, or Action Workflows.  And those workflows are run in parallel by the Workflow Engine.  AuthN workflows run in their own &amp;#8220;context&amp;#8221; and they are synchronous to each request.  For example, if Ikrima requests to join BillG&amp;#8217;s Direct Reports and he kicks off 2 authentication workflows and at the same time, Frank requests to join Administrator&amp;#8217;s Group and he kicks off an AuthN workflow, what will happen?&lt;/p&gt;

&lt;p&gt;Well both requests will happen at the same time b/c the webservice is multi-threaded. So here&amp;#8217;s a timeline view&lt;/p&gt;
&lt;p&gt;Ikrima&lt;/p&gt;
&lt;p&gt;&lt;span&gt; &lt;/span&gt;Join Group&lt;/p&gt;
&lt;p&gt;&lt;span&gt; &lt;/span&gt;Authenticate to AuthN Workflow 1&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;Authenticate to AuthN Workflow 2&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;Continue processing&lt;/p&gt;
&lt;p&gt;Frank&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;Join Group&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;Authenticate to AuthN Workflow 2&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;Continue Processing&lt;/p&gt;

&lt;p&gt;So the webservice sequentially processes AuthN workflows in the context of one request.&lt;/p&gt;

&lt;p&gt;Now what about AuthZ/Action workflows?  Well those are &lt;strong&gt;asynchronous&lt;/strong&gt;. Suppose Ikrima joins BillG&amp;#8217;s group and he kicks off an Email Notification workflow and an Approval Workflow.  And suppose Frank does that at the same time.  What does that look like?&lt;/p&gt;

&lt;p&gt;Ikrima&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;Join Group&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;Approval Workflow Gets Kicked Off &amp;lt;&amp;#8212;-Notice, they get kicked off at the same time&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;Email Notification Workflow Gets Kicked off  &amp;lt;&amp;#8212;-Notice, they get kicked off at the same time&lt;/p&gt;

&lt;p&gt;Frank&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;Join Group&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;Approval Workflow Gets Kicked Off  &amp;lt;&amp;#8212;-Notice, they get kicked off at the same time&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;Email Notification Workflow Gets Kicked off  &amp;lt;&amp;#8212;-Notice, they get kicked off at the same time&lt;/p&gt;

&lt;p&gt;So how many workflows do we have in flight in the AuthN scenario?  2 at most.  Ikrima&amp;#8217;s AuthN Workflow 1 &amp;amp; Frank&amp;#8217;s AuthN Workflow 1.&lt;/p&gt;
&lt;p&gt;What about AuthZ? 4. Ikrima &amp;amp; Frank&amp;#8217;s Approval &amp;amp; Email workflows.&lt;/p&gt;

&lt;p&gt;And now how many workflows can we have inflight at the same time?  Well, those are determined by&lt;a href="http://blog.aesthetixsoftware.com/post/2145708996/fim-configuration-parameters"&gt; configuration parameters&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So why is there a different &lt;span&gt;maxSimultaneousAuthenticationWorkflows &amp;amp; &lt;/span&gt;&lt;span&gt;maxSimultaneousAuthorizationAndActionWorkflows?&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Well, remember that Authorization/Action workflows can be long-running and are asynchronously invoked.  For example, the approval activity needs to wait on a manager to approve a request.  But, the approval activity doesn&amp;#8217;t need to be running and in memory the entire time.  So, it can passivate (aka store itself &amp;amp; state to SQL) and then the workflow engine can go off and process another workflow.&lt;/p&gt;
&lt;p&gt;Authentication activities are a different matter.  We need a response right now; imagine if when logging in or resetting your password, you were stuck waiting on a manager&amp;#8217;s approval to authenticate yourself.  So, because of this, authentication workflows never passivate which is why I said earlier, you would have a problem trying to get 70k users registering at the same time.&lt;/p&gt;

&lt;p&gt;As far as how many longstanding requests are in the system, well, you can have as many as your system handles it (and maybe there are some other configuration parameters that cull out expired requests too).&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/aesthsoft/~4/s_GxS92cMS8" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/aesthsoft/~3/s_GxS92cMS8/4042377329</link><guid isPermaLink="false">http://blog.aesthetixsoftware.com/post/4042377329</guid><pubDate>Wed, 23 Mar 2011 03:36:42 -0700</pubDate><category>FIM</category><category>performance</category><feedburner:origLink>http://blog.aesthetixsoftware.com/post/4042377329</feedburner:origLink></item><item><title>How To Retrieve Endpoint address in Custom Interactive Activities</title><description>&lt;p&gt;&lt;span&gt;
&lt;p class="MsoNormal"&gt;&lt;span&gt;This has been frustrating me for a couple of days since I couldn&amp;#8217;t find a supported way of doing it, so I finally just found a way to use reflection to poke deep into some dataexchanges.  &lt;strong&gt;Use at your own risk, as this is not supported.&lt;/strong&gt;&lt;strong&gt;&lt;br/&gt;&lt;/strong&gt;In your activity, you write:
&lt;p&gt;&lt;span&gt;protected&lt;/span&gt;&lt;span&gt; &lt;span&gt;override&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; OnActivityExecutionContextLoad(&lt;span&gt;IServiceProvider&lt;/span&gt; provider)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;{&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;if&lt;/span&gt; (&lt;span&gt;this&lt;/span&gt;.baseAddresses == &lt;span&gt;null&lt;/span&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;{&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;Type&lt;/span&gt; hostActivationServiceInteralType =&lt;span&gt;typeof&lt;/span&gt;(Microsoft.ResourceManagement.&lt;span&gt;AuthenticationWorkflowMode&lt;/span&gt;).Assembly.GetType(&lt;span&gt;&amp;#8220;Microsoft.ResourceManagement.Workflow.Runtime.HostActivationService&amp;#8221;&lt;/span&gt;);&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;hostActivationServiceInternalObject = provider.GetService(hostActivationServiceInteralType);&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;var&lt;/span&gt; propertyInfo = hostActivationServiceInternalObject.GetType().GetProperty(&lt;span&gt;&amp;#8220;BaseAddresses&amp;#8221;&lt;/span&gt;,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;                                                                                            &lt;/span&gt;&lt;span&gt;BindingFlags&lt;/span&gt;.NonPublic | &lt;span&gt;BindingFlags&lt;/span&gt;.Public | &lt;span&gt;BindingFlags&lt;/span&gt;.Instance);&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;if&lt;/span&gt; (propertyInfo&amp;#160;!= &lt;span&gt;null&lt;/span&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;{&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;                    &lt;/span&gt;&lt;span&gt;ReadOnlyCollection&lt;/span&gt;&amp;lt;&lt;span&gt;Uri&lt;/span&gt;&amp;gt; result = propertyInfo.GetValue(hostActivationServiceInternalObject, &lt;span&gt;null&lt;/span&gt;) &lt;span&gt;as&lt;/span&gt; &lt;span&gt;ReadOnlyCollection&lt;/span&gt;&amp;lt;&lt;span&gt;Uri&lt;/span&gt;&amp;gt;;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;                    &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;.baseAddresses = &lt;span&gt;new&lt;/span&gt; &lt;span&gt;List&lt;/span&gt;&amp;lt;&lt;span&gt;string&lt;/span&gt;&amp;gt;();&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;                    &lt;/span&gt;&lt;span&gt;if&lt;/span&gt; (result&amp;#160;!= &lt;span&gt;null&lt;/span&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;                    &lt;/span&gt;{&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;                        &lt;/span&gt;&lt;span&gt;foreach&lt;/span&gt; (&lt;span&gt;Uri&lt;/span&gt; baseAddress &lt;span&gt;in&lt;/span&gt; result)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;                        &lt;/span&gt;{&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;                            &lt;/span&gt;&lt;span&gt;if&lt;/span&gt; (baseAddress.AbsoluteUri.StartsWith(&lt;span&gt;&amp;#8220;http:&amp;#8221;&lt;/span&gt;,&lt;span&gt;StringComparison&lt;/span&gt;.OrdinalIgnoreCase))&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;                            &lt;/span&gt;{&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;                                &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;.baseAddresses.Add(baseAddress.AbsoluteUri);&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;                            &lt;/span&gt;}&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;                        &lt;/span&gt;}&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;                    &lt;/span&gt;}&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;}&lt;/span&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/aesthsoft/~4/wRnYi-AOAW4" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/aesthsoft/~3/wRnYi-AOAW4/4022715788</link><guid isPermaLink="false">http://blog.aesthetixsoftware.com/post/4022715788</guid><pubDate>Tue, 22 Mar 2011 05:07:04 -0700</pubDate><category>FIM</category><feedburner:origLink>http://blog.aesthetixsoftware.com/post/4022715788</feedburner:origLink></item><item><title>How To Bulk Register Users for Password Reset in FIM</title><description>&lt;p&gt;To do this bulk load, you have to understand how the FIM engine stores authentication information. To make this simple, let&amp;#8217;s use the User Ikrima as our user, the default QA Activity as the authentication activity, and the default authentication workflow as our example (but you can generalize to everything else)&lt;/p&gt;


&lt;ul&gt;&lt;li&gt;Ikrima has a multi-valued attribute (AuthNWFRegistered ) that lists all the workflows that he has registered for.  This attribute normally gets populated by FIM when Ikrima finishes registration.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;span mce_style="white-space:pre"&gt; &lt;/span&gt;So, to programmatically register Ikrima, you would need to insert the GUID of the default AuthN Workflow (9c3aca59-a85c-437f-bb67-9ce5a70521d7) into Ikrima.AuthNWFRegistered&lt;/p&gt;


&lt;ul&gt;&lt;li&gt;Now each activity in your AuthN workflow stores its registration data in GateRegistration Objects (the workflow engine creates these objects, the activity is only responsible for providing the data it needs to store).  So, you&amp;#8217;ll need to use the FIM Public client to create those objects.  Some activities (such as the &lt;span mce_style="color: #a31515; font-family: consolas; white-space: pre; "&gt;PasswordCheckGate &amp;amp; LockoutGate) &lt;/span&gt;do not need to create registration data.  The QA Activity does.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;So what goes inside a GateRegistration Object? Well, here are the attributes you need to fill&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;GateID - This identifies which instance of the QA Activity in that workflow this registration data is tied to.  For example, if we had two different QA Activities inside one workflow, which one does this Gate Registration Object belong to?  That&amp;#8217;s what GateID is for.  What is the format of GateID?  Well, it&amp;#8217;s the QualifiedName of the activity (in the workflow context, you can retrieve it from Activity.QualifiedName).  But where else can you retrieve this?  Look at the XOML of the workflow definition.&lt;/li&gt;
&lt;/ol&gt;For example, here&amp;#8217;s the XOML snippet for the OOB authn definition:
&lt;pre&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;ns0:AuthenticationGateActivity&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ValidationError&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;"&lt;span&gt;{x:Null}&lt;/span&gt;"&lt;span&gt; &lt;/span&gt;&lt;span&gt;x:Name&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;"&lt;span&gt;&lt;strong&gt;&lt;em&gt;&lt;u&gt;authenticationGateActivity3&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/span&gt;"&lt;span&gt; &lt;/span&gt;&lt;span&gt;RegistrationData&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;"&lt;span&gt;{x:Null}&lt;/span&gt;"&lt;span&gt; &lt;/span&gt;&lt;span&gt;ChallengeResponse&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;"&lt;span&gt;{x:Null}&lt;/span&gt;"&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;span&gt;    &amp;lt;&lt;/span&gt;&lt;span&gt;ns0:AuthenticationGateActivity.AuthenticationGate&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;span&gt;      &amp;lt;&lt;/span&gt;&lt;span&gt;ns0:QAAuthenticationGate&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ResponseTimeout&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;"&lt;span&gt;00:05:00&lt;/span&gt;"&lt;span&gt; &lt;/span&gt;&lt;span&gt;NumQsReqCorrectAns&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;"&lt;span&gt;3&lt;/span&gt;"&lt;span&gt; &lt;/span&gt;&lt;span&gt;NumQsReqRegistration&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;"&lt;span&gt;3&lt;/span&gt;"&lt;span&gt; &lt;/span&gt;&lt;span&gt;NumQsRandomPresented&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;"&lt;span&gt;3&lt;/span&gt;"&lt;span&gt; &lt;/span&gt;&lt;span&gt;NumQsDisplayedForReg&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;"&lt;span&gt;3&lt;/span&gt;"&lt;span&gt; &lt;/span&gt;&lt;span&gt;ValidationError&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;"&lt;span&gt;{x:Null}&lt;/span&gt;"&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;span&gt;        &amp;lt;&lt;/span&gt;&lt;span&gt;ns0:QAAuthenticationGate.Questions&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;span&gt;          &amp;lt;&lt;/span&gt;&lt;span&gt;x:Array&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Type&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;"&lt;span&gt;{x:Type p9:String}&lt;/span&gt;"&lt;span&gt; &lt;/span&gt;&lt;span&gt;xmlns:p9&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;"&lt;span&gt;clr-namespace:System;Assembly=mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089&lt;/span&gt;"&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;span&gt;            &amp;lt;&lt;/span&gt;&lt;span&gt;ns1:String&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;xmlns:ns1&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;"&lt;span&gt;clr-namespace:System;Assembly=mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089&lt;/span&gt;"&lt;span&gt;&amp;gt;&lt;/span&gt;Customized Question 1&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;ns1:String&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;span&gt;            &amp;lt;&lt;/span&gt;&lt;span&gt;ns1:String&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;xmlns:ns1&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;"&lt;span&gt;clr-namespace:System;Assembly=mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089&lt;/span&gt;"&lt;span&gt;&amp;gt;&lt;/span&gt;Question Custom 2&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;ns1:String&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;span&gt;            &amp;lt;&lt;/span&gt;&lt;span&gt;ns1:String&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;xmlns:ns1&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;"&lt;span&gt;clr-namespace:System;Assembly=mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089&lt;/span&gt;"&lt;span&gt;&amp;gt;&lt;/span&gt;The 3rd question&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;ns1:String&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;span&gt;          &amp;lt;/&lt;/span&gt;&lt;span&gt;x:Array&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;span&gt;        &amp;lt;/&lt;/span&gt;&lt;span&gt;ns0:QAAuthenticationGate.Questions&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;span&gt;      &amp;lt;/&lt;/span&gt;&lt;span&gt;ns0:QAAuthenticationGate&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;span&gt;    &amp;lt;/&lt;/span&gt;&lt;span&gt;ns0:AuthenticationGateActivity.AuthenticationGate&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;span&gt;  &amp;lt;/&lt;/span&gt;&lt;span&gt;ns0:AuthenticationGateActivity&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;You can see, the Activity name is &amp;#8220;authenticationGateActivity3&amp;#8221;.  &lt;/p&gt;

&lt;ol&gt;&lt;li&gt;GateType - This used to specify the type of activity tied to this GateRegistration object.  For example, it would distinguish between LockOut Activity vs. QA Activity.  To my recollection, this isn&amp;#8217;t used anymore.  But, the QA GateType ID is &lt;span&gt;45C4D8BB-D34C-453d-8346-C9061A2A1E4C&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;UserID - This is the GUID of the Ikrima user object&lt;/li&gt;
&lt;li&gt;WorkflowDefinition - This is the GUID of the Password Reset AuthN Workflow: 9c3aca59-a85c-437f-bb67-9ce5a70521d7&lt;/li&gt;
&lt;li&gt;GateData - Now this is the custom data that the QA Gate activity stores.  If you look at the public client solution, you can see that other people have reverse engineered this data format.&lt;/li&gt;
&lt;/ol&gt;&lt;br/&gt;&lt;span&gt; &lt;/span&gt;To rehash that, the GateData for QA Gate is in the format:&lt;br/&gt;&lt;span&gt; &lt;/span&gt;answerIndex&lt;span&gt; &lt;/span&gt;+ &amp;#8216;\n&amp;#8217;&lt;span&gt; &lt;/span&gt;+ SHA256Hash( normalizedResponse(userAnswer)+user.Guid.ToString()).GetUnicodeEncoding()&lt;span&gt; &lt;/span&gt;+ &amp;#8216;\n&amp;#8217;&lt;br/&gt;&lt;span&gt; &lt;/span&gt;normalizeResponse() means strip all the whitespace and turn everything to lower case; &lt;strong&gt;also, answerIndex starts at 1, not 0.&lt;/strong&gt; So answerIndex = 1 means the answer to question 1; 0 is not a valid index.  So, an example layout would be&lt;br/&gt;&lt;span&gt; &lt;/span&gt;2&amp;#8217;\n&amp;#8217;djfkddjfkddjfkddjfkddjfkddjfkddjfkddjfkd&amp;#8217;\n&amp;#8217;&lt;span&gt; &lt;/span&gt;4&amp;#8217;\n&amp;#8217;djfkddjfkddjfkddjfkddjfkddjfkddjfkddjfkd&amp;#8217;\n&amp;#8217;&lt;br/&gt;&lt;br/&gt;After you created the Gate Registration Object for the QA Gate, your user should now be able to authenticate against the AuthN Password Reset Workflow&lt;img src="http://feeds.feedburner.com/~r/aesthsoft/~4/J6l_UGH4izA" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/aesthsoft/~3/J6l_UGH4izA/3699698401</link><guid isPermaLink="false">http://blog.aesthetixsoftware.com/post/3699698401</guid><pubDate>Mon, 07 Mar 2011 02:55:07 -0800</pubDate><category>FIM</category><category>Password Reset</category><category>Registration</category><feedburner:origLink>http://blog.aesthetixsoftware.com/post/3699698401</feedburner:origLink></item><item><title>Using Wireless with Hyper-V through RRAS</title><description>&lt;a href="http://sqlblog.com/blogs/john_paul_cook/archive/2008/03/23/using-wireless-with-hyper-v.aspx"&gt;Using Wireless with Hyper-V through RRAS&lt;/a&gt;: &lt;p&gt;I always forget how to set my wireless card as a network for use with my Hyper-V machines running on my laptop (all sorts of unsupported configurations).  John Paul has a great write up on how to configure this in &lt;10 minutes&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/aesthsoft/~4/6hi-5vLssXo" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/aesthsoft/~3/6hi-5vLssXo/3580312904</link><guid isPermaLink="false">http://blog.aesthetixsoftware.com/post/3580312904</guid><pubDate>Tue, 01 Mar 2011 01:57:52 -0800</pubDate><category>Hyper-V</category><category>wireless</category><category>Virtual Machine</category><feedburner:origLink>http://blog.aesthetixsoftware.com/post/3580312904</feedburner:origLink></item><item><title>FIM Gotcha with Interactive Endpoints: Security Check Failed</title><description>&lt;p&gt;&lt;span&gt;
&lt;p&gt;Alright, after a couple of hours of troubleshooting a customized deployment, I found the probable cause. This fault is what&amp;#8217;s returned from any activity that uses the XmlInteractiveActivity (e.g. Password Reset, Approval activity, etc) when validation fails.&lt;/p&gt;
&lt;p&gt;When a client talks to these activities, it talks to them directly through an endpoint they create.  In my case, we were talking directly to the Password Reset activity. The PWResetActivity gives access to its endpoint to two users (Anonymous &amp;amp; the user who&amp;#8217;s trying to reset his password).  &lt;/p&gt;
&lt;p&gt;But, how does it determine if a user is anonymous?&lt;br/&gt;Well, it does a sid lookup of the credentials coming in and matches it with sids in the FIM store.&lt;br/&gt;If there&amp;#8217;s no match, it stamps the identity as Anonymous.&lt;/p&gt;
&lt;p&gt;Now when would this be problematic?&lt;br/&gt;Well, if you set the identity of the PwdMgmtProxy.exe service to a FIM Account, every request to reset password will happen in that FIM Account&amp;#8217;s context.&lt;br/&gt;And every password reset will fail.&lt;/p&gt;
&lt;p&gt;Same thing happens if you have a custom client that&amp;#8217;s talking to the endpoints directly running under an account that&amp;#8217;s in the FIM Store. This is not necessary when communicating with the FIM Service endpoint because it stamps any request coming in through the alternate endpoint as anonymous, regardless of the windows credentials attached to your request.&lt;/p&gt;
&lt;p&gt;Why is this layer necessary? &lt;br/&gt;Well when you get to the password reset endpoint, it&amp;#8217;s a separate interactive workflow endpoint, created by the receive activity.  &lt;br/&gt;So without this layer, any user can talk to that endpoint to reset the password of users going through this workflow.&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/aesthsoft/~4/huczrdT-OAM" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/aesthsoft/~3/huczrdT-OAM/2689297757</link><guid isPermaLink="false">http://blog.aesthetixsoftware.com/post/2689297757</guid><pubDate>Mon, 10 Jan 2011 14:31:06 -0800</pubDate><category>FIM</category><category>Troubleshooting</category><feedburner:origLink>http://blog.aesthetixsoftware.com/post/2689297757</feedburner:origLink></item><item><title>Happy holidays &amp; happy new years!</title><description>&lt;p&gt;Here&amp;#8217;s to everyone having a better year than the one before it.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/aesthsoft/~4/C6nrIeuF8vY" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/aesthsoft/~3/C6nrIeuF8vY/2616438842</link><guid isPermaLink="false">http://blog.aesthetixsoftware.com/post/2616438842</guid><pubDate>Wed, 05 Jan 2011 17:38:54 -0800</pubDate><feedburner:origLink>http://blog.aesthetixsoftware.com/post/2616438842</feedburner:origLink></item><item><title>Active Directory Schema</title><description>&lt;p&gt;How do we define object types in AD? Through Schema, a kind of blueprint describing the attributes of that object and what type of data they can hold (Syntaxes).&lt;/p&gt;
&lt;p class="p1"&gt;But, what about if I&amp;#8217;m merging two different organizations with different Schema?  How can I distinguish between Time Warner&amp;#8217;s Contractor vs. AOL&amp;#8217;s Contractor object?  Fortunately, the X.500 standard defines an Object Identifier (OID) to identify each schema object:&lt;/p&gt;
&lt;ul class="ul1"&gt;&lt;li&gt;First part indicates the path to the branch holding the object in a 500 tree-like structure&lt;/li&gt;
&lt;li&gt;The second part uniquely indicates the object in that branch&lt;/li&gt;
&lt;/ul&gt;&lt;p class="p1"&gt;The notation uses integers for each branch and object. Ex:&lt;/p&gt;
&lt;p class="p1"&gt;1.3.6.1.4.1.495 refers to object 495 in branch 1.3.6.1.4.1&lt;/p&gt;
&lt;p class="p1"&gt;To create a schema object, you need to have a unique OID branch &amp;amp; namespace for your organization.  You can refer to the IANA web page &lt;a href="http://www.iana.org/"&gt;&lt;span class="s1"&gt;&lt;a href="http://www.iana.org/"&gt;http://www.iana.org/&lt;/a&gt;&lt;/span&gt;&lt;/a&gt; for more information on how to do this.&lt;/p&gt;
&lt;p class="p1"&gt;While we&amp;#8217;re talking about objects, we should talk about what happens when you delete an object in AD.  You would think that it immediately gets deleted, right?  Nope.  It gets &lt;em&gt;tombstoned.&lt;/em&gt;&lt;/p&gt;
&lt;p class="p1"&gt;The object is stripped of most of its attributes and gets moved to the Deleted Objects container.  Why does this happen? Well for one, you can undelete the object in case you made a mistake. And more importantly, these allows the delete operation to replicate to all domain controllers holding a copy of the object.&lt;/p&gt;
&lt;p class="p1"&gt;Finally, we&amp;#8217;ll wrap up on a quick word on how you can define different classes.  Suppose you had a Contractor type in your organization.  The contractor type would probably share a lot of attributes with the User class.  It would be nice if you didn&amp;#8217;t have to redefine everything.&lt;/p&gt;
&lt;p class="p1"&gt;Well, with class inheritance we can do exactly this.  Our schema classes can be defined as one of three things:&lt;/p&gt;
&lt;ul class="ul1"&gt;&lt;li&gt;Structural&lt;/li&gt;
&lt;/ul&gt;&lt;p class="p1"&gt;These types of classes allow you to directly create objects of its type in AD.  For example, the group class.&lt;/p&gt;
&lt;ul class="ul1"&gt;&lt;li&gt;Abstract&lt;/li&gt;
&lt;/ul&gt;&lt;p class="p1"&gt;If you&amp;#8217;re familiar with object oriented programming, abstract schema classes behave just like abstract classes in programming.  They allow you to define a base set of attributes that are shared by any derived class but you would never want to create an instance of that base type.  Abstract classes are the same as structural, with the only difference being you cannot instantiate abstract types.&lt;/p&gt;
&lt;ul class="ul1"&gt;&lt;li&gt;Auxiliary&lt;/li&gt;
&lt;/ul&gt;&lt;p class="p1"&gt;An auxiliary class is used to store sets of attributes that other classes can inherit.  You can think of these classes as a grouping mechanism to tie together a collection of loosely coupled attributes.  For example, the securityPrincipal is an auxiliary class that is inherited by the organizationalPerson class.  SecurityPrincipal attributes such as SID exists tangentially to a Person object; they can be applied to a person, a computer, a group, or anything that requires it to be a security principal.  Thus, it&amp;#8217;s perfectly suited to be an auxiliary class.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/aesthsoft/~4/j21H35VJFKs" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/aesthsoft/~3/j21H35VJFKs/2169208194</link><guid isPermaLink="false">http://blog.aesthetixsoftware.com/post/2169208194</guid><pubDate>Fri, 10 Dec 2010 14:46:06 -0800</pubDate><category>Active Directory</category><category>10 Minute Guides</category><category>Schema</category><category>AD</category><feedburner:origLink>http://blog.aesthetixsoftware.com/post/2169208194</feedburner:origLink></item></channel></rss>

