<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="https://www.w3.org/2005/Atom" xmlns:sy="https://purl.org/rss/1.0/modules/syndication/" xmlns:dc="https://purl.org/dc/elements/1.1/" xmlns:content="https://purl.org/rss/1.0/modules/content/" xmlns:wfw="https://wellformedweb.org/CommentAPI/" xmlns:slash="https://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>Anthony Ho</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/aho/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/aho/feed.xml</link>
    <description />
    <lastBuildDate>Tue, 16 Apr 2019 05:54:49 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>FIM 2010 R2 Portal Customization</title>
      <link>https://docs.microsoft.com/archive/blogs/aho/fim-2010-r2-portal-customization</link>
      <pubDate>Thu, 19 Jul 2012 23:32:00 GMT</pubDate>
      <dc:creator><![CDATA[AnthonyHo]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/aho/2012/07/19/fim-2010-r2-portal-customization/</guid>
      <description><![CDATA[https://technet.microsoft.com/en-us/library/jj134312%28v=ws.10%29.aspx]]></description>
      <content:encoded><![CDATA[<p><a href="https://technet.microsoft.com/en-us/library/jj134312%28v=ws.10%29.aspx">https://technet.microsoft.com/en-us/library/jj134312%28v=ws.10%29.aspx</a></p>]]></content:encoded>
    </item>
    <item>
      <title>FIM 2010 R2 Self-Service Password Reset Deployment Guide</title>
      <link>https://docs.microsoft.com/archive/blogs/aho/fim-2010-r2-self-service-password-reset-deployment-guide</link>
      <pubDate>Tue, 12 Jun 2012 13:26:00 GMT</pubDate>
      <dc:creator><![CDATA[AnthonyHo]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/aho/2012/06/12/fim-2010-r2-self-service-password-reset-deployment-guide/</guid>
      <description><![CDATA[https://www.microsoft.com/en-us/download/details.aspx?id=29959]]></description>
      <content:encoded><![CDATA[<p><a href="https://www.microsoft.com/en-us/download/details.aspx?id=29959">https://www.microsoft.com/en-us/download/details.aspx?id=29959</a></p>]]></content:encoded>
    </item>
    <item>
      <title>FIM 2010 R2 - Web-Based Password Reset, Part 3</title>
      <link>https://docs.microsoft.com/archive/blogs/aho/fim-2010-r2-web-based-password-reset-part-3</link>
      <pubDate>Tue, 06 Dec 2011 06:28:00 GMT</pubDate>
      <dc:creator><![CDATA[AnthonyHo]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/aho/2011/12/06/fim-2010-r2-web-based-password-reset-part-3/</guid>
      <description><![CDATA[FIM lets users reset their passwords only after authenticating them against answers to commonly...]]></description>
      <content:encoded><![CDATA[<p>FIM lets users reset their passwords only after authenticating them against answers to commonly asked security questions that they registered with.</p>
<p>One major complaint about FIM 2010's QA Gate implementation is that it does not allow ITPro to specify some sort of validation or policies on the answers. It's possible that users might enter "abc" for all questions and some believe that is a security concern. (In fact, I used to use 1 for my answers during testing because the keyboard sequence "1&lt;tab&gt;1&lt;tab&gt;1&lt;tab&gt;" is the easiest on the keyboard.)</p>
<h3>QA Gate Enhancement</h3>
<p>We heard your feedback loud and clear. Thus we are making a few changes to FIM 2010 R2, namely:</p>
<ol>
<li>Disallow duplicated answers</li>
<li>Apply a custom regular expression on the answers for validation for all answers per gate</li>
</ol>
<p>Below is a screenshot of the QA Gate Configuration from the workflow designer (aka BPM Designer)</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/78/39/6761.QAEnhancement.png" original-url="https://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-78-39/6761.QAEnhancement.png"><img src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/78/39/6761.QAEnhancement.png" original-url="https://blogs.technet.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-78-39/6761.QAEnhancement.png" alt="" border="0" /></a></p>
<h3>How Does It Work?</h3>
<p>Some of you might ask, "Wait, isn't the answer hashed in the client? How is this possible?" First, Congratulations and well done on knowing password reset in depth. :)</p>
<p>To achieve this validation on the server side, now the answers are sent to the server in un-hashed over a WCF channel protected with message-level encryption (Nothing is changed in the channel itself. We are just changing the payload at the application layer)</p>
<h3>Special Notes</h3>
<p>This check is <em>only</em> enforced during registration phase and the answers are still stored hashed in the database.</p>
<p>To make sure the policies are enforced by default, registration from FIM 2010 clients are disallowed. There is an option at the bottom of the configuration to let you run FIM in hybrid mode during the transitional upgrade period. In that case, FIM 2010 clients will be able to register and bypass the policies, while registrations originating from FIM 2010 R2 clients will have the policies enforced.</p>]]></content:encoded>
    </item>
    <item>
      <title>FIM 2010 R2 - Web-Based Password Reset, Part 2</title>
      <link>https://docs.microsoft.com/archive/blogs/aho/fim-2010-r2-web-based-password-reset-part-2</link>
      <pubDate>Mon, 28 Nov 2011 18:42:00 GMT</pubDate>
      <dc:creator><![CDATA[AnthonyHo]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/aho/2011/11/28/fim-2010-r2-web-based-password-reset-part-2/</guid>
      <description><![CDATA[Web-Based Password Reset is not just about writing a web client in ASP.NET. I mentioned that a few...]]></description>
      <content:encoded><![CDATA[<p>Web-Based Password Reset is not just about writing a web client in ASP.NET. I mentioned that a few times when talking to different people. Everyone can do that by writing their own WCF client. If reverse engineering the FIM WebService protocol is too hard, there is the <a href="https://fim2010client.codeplex.com/">open source client supported by the community</a>. In fact, BlueVault has done exactly <a href="https://www.bluevaultsoftware.com/products/Pages/SSPR.aspx">that</a>. It definitely will not be too hard for us to do. However, when we think through the scenarios in depth, we realize most customers want web-based SSPR so that people not connected to the network can also reset their password. That implies exposing not only the portal, but also indirectly exposes FIMService to the extranet. This make us rethink our security model.</p>
<p>In this blog post and the coming few ones, I am going to talk about a few improvements related to the security aspect of web-based SSPR.</p>
<h2>Scenario</h2>
<p>In FIM 2010, password reset from the intranet would require user authenticates themselves using QA Gate. In R2, when ITPros exposes web-based SSPR to the extranet, they might want to have additional authentication for added security (e.g. RSA token) yet keeping intranet reset as easy as before.</p>
<h2>What is Security Context?</h2>
<p>We tackle this scenario by introduce something called security context which can be found in the <em>extended attribute</em> of the request.</p>
<pre class="scroll"><code class="csharp">namespace Microsoft.ResourceManagement.WebServices.WSResourceManagement<br />{<br />&nbsp;&nbsp;&nbsp; public enum SecurityContext<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Extranet,<br />&nbsp;&nbsp;&nbsp; <code class="csharp">&nbsp;&nbsp;&nbsp; </code>NoneSpecified<br /><code class="csharp">&nbsp;&nbsp;&nbsp; </code>}<br />}</code></pre>
<p>A request tagged with Extranet means it comes from the SSPR portal that is serving requests coming from the extranet.</p>
<h2>How does Security Context Work?</h2>
<p>If you look at the new workflow designer UI, you will notice some of the gate-configuration pages have an extract section for SecurityContext. The description is self-explanatory. If set to <em>Extranet</em>, the activity/gate will only be run if the request comes from the extranet.</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/78/39/3146.SecurityContext.png" original-url="https://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-78-39/3146.SecurityContext.png"><img src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/78/39/3146.SecurityContext.png" original-url="https://blogs.technet.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-78-39/3146.SecurityContext.png" alt="" border="0" /></a></p>
<h2>How do I Configure SecurityContext Tagged in Requests from SSPR Portals?</h2>
<p>In setup, there is the option to specify that.</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/78/39/3113.SecurityContextSetup.png" original-url="https://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-78-39/3113.SecurityContextSetup.png"><img src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/78/39/3113.SecurityContextSetup.png" original-url="https://blogs.technet.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-78-39/3113.SecurityContextSetup.png" alt="" border="0" /></a></p>
<p>That translates to &lt;add key="SecurityContextAssertion" value="[Extranet|NoneSpecified]" /&gt; at "C:\Program Files\Microsoft Forefront Identity Manager\2010\Password [Registration|Reset] Portal\Web.config"</p>]]></content:encoded>
    </item>
    <item>
      <title>Office 365 Password Reset GA</title>
      <link>https://docs.microsoft.com/archive/blogs/aho/office-365-password-reset-ga</link>
      <pubDate>Mon, 21 Nov 2011 17:27:00 GMT</pubDate>
      <dc:creator><![CDATA[AnthonyHo]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/aho/2011/11/21/office-365-password-reset-ga/</guid>
      <description><![CDATA[Sooner or later, you may forget the password that you need to sign in to your account. It happens to...]]></description>
      <content:encoded><![CDATA[<p>Sooner or later, you may forget the password that you need to sign in to your account. It happens to just about everyone. If you forget your Office 365 password, and you&rsquo;re not an Office 365 administrator, confess your predicament to an administrator in your organization, and the kind administrator resets your password.</p>
<p>If <i>you&rsquo;re</i> the administrator, it&rsquo;s a little more complicated. If you&rsquo;re not the only administrator, you can ask another administrator to reset your password. If you are the only administrator, or if another administrator isn&rsquo;t available, you can use the new automated administrator password reset process. On the <a href="https://login.microsoftonline.com/">Office 365 sign-in page</a>, click <b>Forgot your password?</b> to start the process. We want to protect the security of your account, so you have to follow several steps. As you step through the process, you&rsquo;ll receive an email containing a link. When you click that link, a text message containing a code is sent to your mobile phone, and a Web page is displayed where you enter that code. After you enter the code and click <b>Next</b>, then you enter a new password.</p>
<p>For the administrator password reset to work, you must have already provided a phone number on which you can receive a text (SMS) message and an alternate email address. The email address must not be your Office 365 email address, because if you can&rsquo;t sign in to your Office 365 account, you can&rsquo;t retrieve email sent to that address. You enter this information in the user management area. To get there, click <b>Admin</b>, and under <b>Management</b>, click <b>Users</b>. On the <b>Settings</b> tab, you enter the email address in the <b>Alternate email address</b> box. On the <b>Properties</b> tab, you enter the mobile phone number in the <b>Mobile phone</b> box.</p>
<p>Once you submit the reset request, you need to respond promptly to the email and to the text message. There is a 10-minute timeout period each for the email and for the text message, after which you'll have to restart the process.</p>
<p>If you haven&rsquo;t provided alternate email address and mobile telephone information, you may see a popup window that prompts you to provide this information when you sign in to Office 365. Taking a few seconds to type the information may spare you a headache later.</p>
<p>For more information about how an administrator can reset his or her own password, see the Help topics:</p>
<ul>
<li>For Office 365 for enterprises, see <a href="https://onlinehelp.microsoft.com/en-us/Office365-enterprises/hh143503.aspx">Reset an administrator's password</a></li>
<li>For Office 365 for professionals and small businesses, see <a href="https://onlinehelp.microsoft.com/en-us/Office365-smallbusinesses/gg192871.aspx">Reset an administrator's password</a></li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>Office 365 Password Reset Beta</title>
      <link>https://docs.microsoft.com/archive/blogs/aho/office-365-password-reset-beta</link>
      <pubDate>Mon, 29 Aug 2011 22:37:13 GMT</pubDate>
      <dc:creator><![CDATA[AnthonyHo]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/aho/2011/08/29/office-365-password-reset-beta/</guid>
      <description><![CDATA[Over the last year, I have been working on this Office 365 Password Reset project.
We are doing a...]]></description>
      <content:encoded><![CDATA[<p>Over the last year, I have been working on this Office 365 Password Reset project.</p>
<p>We are doing a closed beta. If you are interested to signup and provide feedback, click on the link which contains information on the action items.</p>
<p><a href="https://community.office365.com/en-us/b/office_365_technical_blog/archive/2011/08/26/password-reset-beta.aspx">https://community.office365.com/en-us/b/office_365_technical_blog/archive/2011/08/26/password-reset-beta.aspx</a></p>]]></content:encoded>
    </item>
    <item>
      <title>FIM 2010 R2 - Web-Based Password Reset, Part 1</title>
      <link>https://docs.microsoft.com/archive/blogs/aho/fim-2010-r2-web-based-password-reset-part-1</link>
      <pubDate>Sun, 31 Jul 2011 17:59:00 GMT</pubDate>
      <dc:creator><![CDATA[AnthonyHo]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/aho/2011/07/31/fim-2010-r2-web-based-password-reset-part-1/</guid>
      <description><![CDATA[I am very excited to let everyone knows that FIM 2010 R2 Beta has released featuring Web-Based...]]></description>
      <content:encoded><![CDATA[<p>I am very excited to let everyone knows that <strong>FIM 2010 R2 Beta has released featuring Web-Based Password Reset</strong>.</p>
<h3>How to download FIM 2010 R2 Beta</h3>
<ol>
<li>Go <a href="https://connect.microsoft.com/site433">here</a>.</li>
<li>Answer the survey questions and Submit. This auto-approves you for the Beta connection.</li>
<li>Click the Downloads link in the left column.</li>
<li>Click the FIM 2010 R2 Beta download link.</li>
<li>Follow the instructions.</li>
</ol>
<p>The download also includes R2 language pack and documentations. We will soon be publishing the documentations on TechNet as well.</p>
<h3>Web-Based Password Reset - Screenshots</h3>
<ol>
<li>Registration</li>
<ol>
<li>Welcome Screen<br /><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/78/39/4377.Registration-WelcomeScreen.png" original-url="https://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-78-39/4377.Registration_2D00_WelcomeScreen.png"><img src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/78/39/4377.Registration-WelcomeScreen.png" original-url="https://blogs.technet.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-78-39/4377.Registration_2D00_WelcomeScreen.png" alt="" border="0" /></a></li>
<li>Password Gate. It asks for your password. You don't want someone else to register for you while you are not at your machine right?<br /><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/78/39/4532.Registration-PasswordGate.png" original-url="https://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-78-39/4532.Registration_2D00_PasswordGate.png"><img src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/78/39/4532.Registration-PasswordGate.png" original-url="https://blogs.technet.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-78-39/4532.Registration_2D00_PasswordGate.png" alt="" border="0" /></a></li>
<li>QA Gate. Hm... What is my Employee number? Let me think...<br /><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/78/39/7612.Registration-QA.png" original-url="https://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-78-39/7612.Registration_2D00_QA.png"><img src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/78/39/7612.Registration-QA.png" original-url="https://blogs.technet.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-78-39/7612.Registration_2D00_QA.png" alt="" border="0" /></a></li>
<li>That's it. Pretty easy huh.<br /><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/78/39/7534.Registration-Finish.png" original-url="https://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-78-39/7534.Registration_2D00_Finish.png"><img src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/78/39/7534.Registration-Finish.png" original-url="https://blogs.technet.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-78-39/7534.Registration_2D00_Finish.png" alt="" border="0" /></a></li>
</ol>
<li>Reset</li>
<ol>
<li>I don't remember my password. Let's reset it.<br /><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/78/39/8867.Reset-WelcomeScreen.png" original-url="https://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-78-39/8867.Reset_2D00_WelcomeScreen.png"><img src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/78/39/8867.Reset-WelcomeScreen.png" original-url="https://blogs.technet.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-78-39/8867.Reset_2D00_WelcomeScreen.png" alt="" border="0" /></a></li>
<li>I know the answers :)<br /><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/78/39/4353.Reset-QA.png" original-url="https://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-78-39/4353.Reset_2D00_QA.png"><img src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/78/39/4353.Reset-QA.png" original-url="https://blogs.technet.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-78-39/4353.Reset_2D00_QA.png" alt="" border="0" /></a></li>
<li>What do I want for my new password?<br /><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/78/39/6837.Reset-NewPassword.png" original-url="https://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-78-39/6837.Reset_2D00_NewPassword.png"><img src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/78/39/6837.Reset-NewPassword.png" original-url="https://blogs.technet.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-78-39/6837.Reset_2D00_NewPassword.png" alt="" border="0" /></a></li>
<li>Wow, I can't believe it is that easy and fast.<br /><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/78/39/8345.Reset-Finish.png" original-url="https://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-78-39/8345.Reset_2D00_Finish.png"><img src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/78/39/8345.Reset-Finish.png" original-url="https://blogs.technet.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-78-39/8345.Reset_2D00_Finish.png" alt="" border="0" /></a></li>
</ol></ol>]]></content:encoded>
    </item>
    <item>
      <title>RunAs in FIM 2010</title>
      <link>https://docs.microsoft.com/archive/blogs/aho/runas-in-fim-2010</link>
      <pubDate>Wed, 27 Jul 2011 02:34:00 GMT</pubDate>
      <dc:creator><![CDATA[AnthonyHo]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/aho/2011/07/27/runas-in-fim-2010/</guid>
      <description><![CDATA[Often times, I come across the question
How can I write some code to do something as another user...]]></description>
      <content:encoded><![CDATA[<p>Often times, I come across the question</p>
<h3>How can I write some code to do something as another user in FIM 2010?</h3>
<p>Generally I see two different answers:</p>
<ol>
<li>Impersonate the other user</li>
<li>Set the <a href="https://msdn.microsoft.com/en-us/library/microsoft.resourcemanagement.workflow.activities.createresourceactivity.actorid.aspx">ActorId</a> to the user</li>
</ol>
<p>So which one is correct?</p>
<p>In fact, both can be correct, depending on what you are trying to do.</p>
<h3>How does FIM work?</h3>
<p>To understand which approach you should use, you have to understand how FIM works.</p>
<p>FIMService exposes different WebService endpoints for differetn Create / Read / Update / Delete / Enumerate / etc operations. Those endpoints have a binding that requires Kerberos. When an EXE running as DomainA\JohnDoe makes a WebService call to FIMService, FIMService will look at the WindowsIdentity of the caller and first thing it does is creating a Request Object with Requestor stamped as the calling user (JohnDoe in this case). This is pretty much a few of the only place where FIMService is looking at the WindowsIdentity. From then on, FIMService will follow the request processing pipeline based on the Request Object.</p>
<p>Now consider an ASP.NET application (imagine a FIMPortal clone) is running as DomainA\PortalServiceAccount which provides a front-end UX for Group Management. When JohnDoe goes to the portal, the ASP.NET app should really be making the WebService call as JohnDoe (instead of PortalServiceAccount) so the rights / permissions applies. In this case, it is not hard to imagine that ASP.NET code should <em>impersonate</em> JohnDoe and make the WebService call to FIMService. This is answer #1.</p>
<p>After the Request Object is created with proper Requestor stamped, FIMService executes the request processing pipeline under its own credential (i.e. FIMService service account). FIMService does NOT impersonate the user. That's partly because FIMService manages its own rights / permissions using Management Policy Rule (MPR). FIMService does NOT rely on Active Directory's permission infrastructure.</p>
<p>As part of the request processing pipeline, FIMService will run different Workflows and Activities. Since FIMService does NOT impersonate the Requestor, it is <em>FIMService service account</em> that is executing the code as far as .NET and OS can tell. Now, in the Activity code, if you want to do something as JohnDoe, you will set the ActorId to JohnDoe. This is answer #2.</p>
<p>Base line is that:</p>
<ul>
<li>Kerberos is an Active Directory construct and it's the way to let FIMService knows who is making the WebService call. A client application running as UserA can impersonate as UserB when making the WebService call so the Requestor would become UserB. If you are writing a custom client to consume FIMService's WebService endpoints, you should impersonate.</li>
<li>On the other hand, ActorId is a FIMService construct in the Activity so that rights check and a few other things happens appropriately (FIMService service account is pretty much omnipotent in an Activity)</li>
<li>Nothing prevents you to impersonate within your custom Activity (if you know what you are doing). For example, you can impersonate to make call outside of FIMService to do something else.</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>FIM 2010 Self-Service Password Reset Now Supports All Domain Password Policies</title>
      <link>https://docs.microsoft.com/archive/blogs/aho/fim-2010-self-service-password-reset-now-supports-all-domain-password-policies</link>
      <pubDate>Tue, 09 Nov 2010 23:01:48 GMT</pubDate>
      <dc:creator><![CDATA[AnthonyHo]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/aho/2010/11/09/fim-2010-self-service-password-reset-now-supports-all-domain-password-policies/</guid>
      <description><![CDATA[I am excited to announce that FIM 2010 Self-Service Password Reset now supports all domain password...]]></description>
      <content:encoded><![CDATA[<p>I am excited to announce that FIM 2010 Self-Service Password Reset now supports all domain password policies.&nbsp; It was a joint effort between the Windows Active Directory and FIM development teams to provide this new functionality. <br /><br />Details of this change can be found in <a href="https://support.microsoft.com/KB/2443871">https://support.microsoft.com/KB/2443871</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Troubleshooting FIMService / FIMPortal / Password Reset Client</title>
      <link>https://docs.microsoft.com/archive/blogs/aho/troubleshooting-fimservice-fimportal-password-reset-client</link>
      <pubDate>Wed, 29 Sep 2010 01:09:00 GMT</pubDate>
      <dc:creator><![CDATA[AnthonyHo]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/aho/2010/09/29/troubleshooting-fimservice-fimportal-password-reset-client/</guid>
      <description><![CDATA[FIM is a complex product. Once a while, I find myself just clueless why something does not work. I...]]></description>
      <content:encoded><![CDATA[<p>FIM is a complex product. Once a while, I find myself just clueless why something does not work. I have the advantage of having access to the source code and be able to debug. Attaching a debugger isn't a 5-second task and very often the answer is actually in the log. In this blog post, I would talk about how to enable tracing.</p>
<p><b>Warning: you should always backup your config file before making any change.</b></p>
<h1><b>Let's start with the easiest - Password Reset Client</b>.<br /></h1>
<p>The following is the config file for the client at C:\Program Files\Microsoft Forefront Identity Manager\2010\Password Reset Client Service\PwdMgmtProxy.exe.config.</p>
<pre class="scroll"><code class="html">&lt;?xml version="1.0" encoding="utf-8" ?&gt;<br />&lt;configuration&gt;<br />    &lt;configSections&gt;<br />        &lt;section<br />            name="resourceManagementClient"<br />            type="Microsoft.ResourceManagement.WebServices.Client.ResourceManagementClientSection, Microsoft.ResourceManagement"/&gt;<br />    &lt;/configSections&gt;<br />    &lt;resourceManagementClient<br />        resourceManagementServiceBaseAddress="https://localhost:5725"<br />        timeoutInMilliseconds="60000" /&gt;<br />    &lt;appSettings&gt;<br />        &lt;add key="NamedPipeTimeout" value="10000"/&gt;<br />    &lt;/appSettings&gt;<br /><span style="background-color: #ffff00;">&lt;!--</span><br />    &lt;system.diagnostics&gt;<br />        &lt;sources&gt;<br />            &lt;source name="<span style="background-color: #ffff00;">Microsoft.ResourceManagement</span>" switchValue="<span style="background-color: #ffff00;">Warning</span>"&gt;<br />                &lt;listeners&gt;<br />                    &lt;add type="System.Diagnostics.DefaultTraceListener" name="Default"&gt;<br />                        &lt;filter type="" /&gt;<br />                    &lt;/add&gt;<br />                    &lt;add initializeData="<span style="background-color: #ffff00;">C:\Logs\PwdMgmtProxy.svclog</span>"<br />                        type="System.Diagnostics.XmlWriterTraceListener, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"<br />                        name="ResourceManagementListener" traceOutputOptions="LogicalOperationStack, DateTime, Timestamp, ProcessId, ThreadId, Callstack"&gt;<br />                        &lt;filter type="" /&gt;<br />                    &lt;/add&gt;<br />                    &lt;add initializeData="Application" type="System.Diagnostics.EventLogTraceListener"<br />                        name="myEventListener"&gt;<br />                        &lt;filter type="System.Diagnostics.EventTypeFilter" initializeData="<span style="background-color: #ffff00;">Error</span>" /&gt;<br />                    &lt;/add&gt;<br />                    &lt;add type="System.Diagnostics.ConsoleTraceListener" name="myConsoleListener"<br />                        traceOutputOptions="LogicalOperationStack, DateTime, Timestamp, ProcessId, ThreadId, Callstack"&gt;<br />                        &lt;filter type="System.Diagnostics.EventTypeFilter" initializeData="Information" /&gt;<br />                    &lt;/add&gt;<br />                &lt;/listeners&gt;<br />            &lt;/source&gt;<br />        &lt;/sources&gt;<br />        &lt;trace autoflush="true" indentsize="0" /&gt;<br />    &lt;/system.diagnostics&gt;<br /><span style="background-color: #ffff00;">--&gt;</span><br />&lt;/configuration&gt;</code></pre>
<p>FIM uses standard <a href="https://msdn.microsoft.com/en-us/library/zs6s4h68%28VS.85%29.aspx">.NET Tracing and Instrumenting</a> libraries. I have highlighted a few important things in the config file:</p>
<ol>
<li>The entire <i>&lt;system.diagnostics&gt;...&lt;system.diagnostics&gt;</i> is commented out. You will need to un-comment that.</li>
<li>The managed part of FIM (FIMService / FIMPortal / Pwd Reset Client) shares the same tracing library and all traces are written to a source <i>Microsoft.ResourceManagement</i>. You should not change this part.</li>
<li>The <i>Warning</i> switch means for all FIM specific traces, only traces of warning level and above will be considered. Notice nothing has been logged so far.</li>
<li>For those traces that are being considered, they will be passed to each of the <i>listeners</i>:<ol>
<li>The XmlWriterTraceListener will write all the traces to the file C:\Logs\PwdMgmtProxy.svclog.</li>
<li>The EventLogTraceListener will further filter only trace with Error level and above, and write them to event log.</li>
</ol></li>
</ol>
<p>So to enable tracing for Password Reset Client, you will need to:</p>
<ol>
<li>Uncomment <i>&lt;system.diagnostics&gt;...&lt;system.diagnostics&gt;</i></li>
<li>Change <i>Warning</i> to <i>Verbose</i></li>
<li>If you want everything to be written to event log as well, change <i>Error</i> to <i>Verbose</i> as well</li>
<li>Create C:\Logs and grant NETWORK SERVICE full access on that folder so the file can be created.</li>
<li>Restart FIMPasswordReset service</li>
</ol>
<h1>FIMService and FIMPortal are really the same</h1>
<p> The FIMService config file (C:\Program Files\Microsoft Forefront Identity Manager\2010\Service\Microsoft.ResourceManagement.Service.exe.config) already contains inline comment on how to enable tracing. You can follow those steps.</p>
<p>If you want to log everything, you can replace &lt;system.diagnostics&gt; section with the following.</p>
<p><b>Warning, the trace file gets really huge and the default EventLogTraceListener will be removed. You should revert your config after troubleshooting so that at least Error level traces are logged to the event log.<br /></b></p>
<p>&nbsp;</p>
<pre class="scroll"><code class="html">&lt;system.diagnostics&gt;<br />  &lt;sources&gt;<br />    &lt;source name="System.ServiceModel.MessageLogging" switchValue="Verbose,ActivityTracing"&gt;<br />      &lt;listeners&gt;<br />        &lt;add type="System.Diagnostics.DefaultTraceListener" name="Default"&gt;<br />          &lt;filter type="" /&gt;<br />        &lt;/add&gt;<br />        &lt;add name="ServiceModelMessageLoggingListener"&gt;<br />          &lt;filter type="" /&gt;<br />        &lt;/add&gt;<br />      &lt;/listeners&gt;<br />    &lt;/source&gt;<br />    &lt;source name="System.ServiceModel" switchValue="Verbose,ActivityTracing"<br />      propagateActivity="true"&gt;<br />      &lt;listeners&gt;<br />        &lt;add type="System.Diagnostics.DefaultTraceListener" name="Default"&gt;<br />          &lt;filter type="" /&gt;<br />        &lt;/add&gt;<br />        &lt;add name="ServiceModelTraceListener"&gt;<br />          &lt;filter type="" /&gt;<br />        &lt;/add&gt;<br />      &lt;/listeners&gt;<br />    &lt;/source&gt;<br />    &lt;source name="Microsoft.ResourceManagement" switchValue="Verbose,ActivityTracing"&gt;<br />      &lt;listeners&gt;<br />        &lt;add type="System.Diagnostics.DefaultTraceListener" name="Default"&gt;<br />          &lt;filter type="" /&gt;<br />        &lt;/add&gt;<br />        &lt;add name="ServiceModelTraceListener"&gt;<br />          &lt;filter type="" /&gt;<br />        &lt;/add&gt;<br />      &lt;/listeners&gt;<br />    &lt;/source&gt;<br />  &lt;/sources&gt;<br />  &lt;sharedListeners&gt;<br />    &lt;add initializeData="<span style="background-color: #ffff00;">C:\Logs\Microsoft.ResourceManagement.Service_messages.svclog</span>"<br />      type="System.Diagnostics.XmlWriterTraceListener, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"<br />      name="ServiceModelMessageLoggingListener" traceOutputOptions="LogicalOperationStack, DateTime, Timestamp, ProcessId, ThreadId, Callstack"&gt;<br />      &lt;filter type="" /&gt;<br />    &lt;/add&gt;<br />    &lt;add initializeData="<span style="background-color: #ffff00;">C:\Logs\Microsoft.ResourceManagement.Service_tracelog.svclog</span>"<br />      type="System.Diagnostics.XmlWriterTraceListener, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"<br />      name="ServiceModelTraceListener" traceOutputOptions="LogicalOperationStack, DateTime, Timestamp, ProcessId, ThreadId, Callstack"&gt;<br />      &lt;filter type="" /&gt;<br />    &lt;/add&gt;<br />  &lt;/sharedListeners&gt;<br />  &lt;trace autoflush="true" /&gt; <br />&lt;/system.diagnostics&gt;</code></pre>
<pre class="scroll"><code class="html">&lt;system.serviceModel&gt;<br />  &lt;diagnostics&gt;<br />    &lt;messageLogging logEntireMessage="true" logMalformedMessages="true" logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="true" /&gt;<br />  &lt;/diagnostics&gt;<br />&lt;/system.serviceModel&gt;<br /><br /></code></pre>
<p>&nbsp;</p>
<p>For FIMPortal, the config file is at C:\inetpub\wwwroot\wss\VirtualDirectories\80\web.config. You will need to change the highlighted filename to something else. For example, use:</p>
<ul>
<li>ILMPortal.Client_messages.svclog</li>
<li>ILMPortal.Client_tracelog.svclog</li>
</ul>
<p>The <i>*_tracelog.svclog</i> contains all the FIM specific traces instrumented by the FIM team (you will spend 99% of your time with this file). On the other hand, <i>*_messages.svclog</i> contains WCF specific traces.</p>
<h1>How to Get Rid of the Generic FIMPortal Error Page?</h1>
<p>When there is an error in FIMPortal, you will see the follow screen which absolutely contains no useful information at all.</p>
<p><img src="https://lh6.ggpht.com/_ogW55ub7GXo/TBlEUukS31I/AAAAAAAAAL8/N6HS45jt7Dk/s1600/image%5B5%5D.png" style="max-width: 550px; border: 0pt none;" height="418" width="640" /></p>
<p><a href="https://setspn.blogspot.com/2010/06/fim-2010-enable-advanced-error-logging.html">Thomas Vuylsteke has blogged about how to get rid of hat</a> to get a full stack trace which is usually enough for you to troubleshoot FIMPortal issues.</p>]]></content:encoded>
    </item>
  </channel>
</rss>