<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" version="2.0">
  <channel>
    <title>Joe Kaplan - Application Architecture</title>
    <link>http://www.joekaplan.net/</link>
    <description>.NET. LDAP. Geekery.</description>
    <language>en-us</language>
    <copyright>Joseph E. Kaplan</copyright>
    <lastBuildDate>Thu, 17 Aug 2006 18:05:52 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 1.9.6264.0</generator>
    <managingEditor>blog@joekaplan.net</managingEditor>
    <webMaster>blog@joekaplan.net</webMaster>
    <item>
      <trackback:ping>http://www.joekaplan.net/Trackback.aspx?guid=9b25d233-a484-4905-a60b-8bb8748c7068</trackback:ping>
      <pingback:server>http://www.joekaplan.net/pingback.aspx</pingback:server>
      <pingback:target>http://www.joekaplan.net/PermaLink,guid,9b25d233-a484-4905-a60b-8bb8748c7068.aspx</pingback:target>
      <dc:creator>Joe Kaplan</dc:creator>
      <wfw:comment>http://www.joekaplan.net/CommentView,guid,9b25d233-a484-4905-a60b-8bb8748c7068.aspx</wfw:comment>
      <wfw:commentRss>http://www.joekaplan.net/SyndicationService.asmx/GetEntryCommentsRss?guid=9b25d233-a484-4905-a60b-8bb8748c7068</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <font size="4">Fast Concurrent Binding Overview</font>
        </p>
        <p>
One of the things I alluded to in my <a href="http://www.joekaplan.net/ATaleOfTwoLDAPStacks.aspx">post</a> that
highlighted the differences in capabilities between the ADSI-based System.DirectoryServices
(SDS) namespace and the raw LDAP-based System.DirectoryServices.Protocols (SDS.P)
was the ability to access a feature called <strong><a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ldap/ldap/using_ldap_for_password_authentication.asp?frame=true">Fast
Concurrent Binding (FCB)</a></strong>.
</p>
        <p>
FCB is a feature available in Active Directory 2003 (and later) and in ADAM. 
To explain it, first let’s cover what happens with a “regular” bind operation in LDAP
against AD or ADAM.  With a normal bind, the user’s credentials are presented
to the LDAP server, either in plaintext format or via the Windows security model if
using a secure binding protocol.  The server then attempts to authenticate these
credentials.  If the credentials are accepted, then the server builds a Windows
token for the user which will be used to for performing security checks on future
operations and changes the state of the current LDAP connection to an authenticated
state so that future requests will continue to use the newly established security
context and this operation is not repeated.  This is the main reason why LDAP
connections are stateful.
</p>
        <p>
FCB eliminates two parts of this equation.  It authenticates the user’s credentials,
but it does not build a Windows token for the user and the connection state stays
anonymous.  As such, the bind operation will give you an “up/down” result based
on whether the user’s name and password were valid, but it won’t let you do anything
else with that connection such as perform searches, except as an anonymous user (which
is pretty limited by default in AD 2003 and ADAM).
</p>
        <p>
The big upside of FCB is that the bind operation is MUCH faster than a normal bind
because the really expensive operation, expanding the user’s group membership to build
the token, is eliminated.  Hence the name <em><strong>fast</strong> concurrent
binding</em>.<sup>*</sup></p>
        <p>
The concurrent part comes from the fact that multiple users can be authenticated on
the same LDAP connection simultaneously without worrying about changing the authenticated
state of the connection, so the expense of setting up and tearing down the associated
socket can also be eliminated.  This makes it potentially even faster.
</p>
        <p>
The big downside with FCB is that it only supports LDAP simple bind, not SASL, and
simple bind does not have a built in mechanism for protecting the credentials on the
wire like the various SASL mechanisms do.  <strong>As such, it is never safe
to use FCB unless some form of transport security is used such as SSL or IPSEC!</strong></p>
        <p>
          <font size="4">When to Use Fast Concurrent Binding</font>
        </p>
        <p>
          <strong>Do</strong> use FCB when your application is doing pure authentication of
credentials via LDAP.  An example of this might be in a web-based application
that uses AD or ADAM as a user store and does LDAP authentication.  If you just
need a “yes/no” vote as to whether a username/password combo is good, FCB will give
you the best performance and may add a significant scalability increase to your application
as a result.  
</p>
        <p>
          <strong>Do not</strong> use FCB if you need to authenticate and then perform operations
against the directory on the user’s behalf (a delegation scenario from the architectural
perspective, although not necessarily using Windows Kerberos delegation features to
implement it).  Since the connection state does not change to “authenticated”,
the user’s credentials will not be used to perform subsequent operations and you won’t
get what you want.
</p>
        <p>
An obvious place where you might want to use FCB would be in something like the ActiveDirectoryMembershipProvider
in ASP.NET 2.0.  My understanding is that the development already thought about
this and tried to add this support already.  Thus, you may already have this
and not even know it!
</p>
        <p>
Another obvious place for this to be used would be in ADFS for authenticating users
in the ADAM store and potentially with users in the AD store as well when used with
the Federation Service Proxy (which accepts credentials via a forms or basic auth
interface in plaintext form).  As of this writing, I do not believe that ADFS
is taking advantage of this feature (or and SDS.P capabilities for that matter). 
Note to product team…
</p>
        <p>
          <font size="4">A Note on ADSI/SDS and Fast Concurrent Binding</font>
        </p>
        <p>
          <em>Hey Joe, I see that ADSI and SDS have an <font face="Courier New">AuthenticationTypes</font> flag
called <font face="Courier New">FastBind</font>.  Can’t I just use that to get
FCB?  Why are you telling me this requires SDS.P?</em>
        </p>
        <p>
The answer here is “no”, they are not the same thing, despite their unfortunately
similar names!  <font face="Courier New"><a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/adsi/adsi/fast_binding_option_for_batch_writemodify_operations.asp?frame=true">FastBind</a></font> in
ADSI/SDS actually has nothing to do with the bind operation per say, but has to do
with what ADSI does after the bind when you go to access an object.  With <font face="Courier New">FastBind</font> NOT
set (the default), ADSI does a base-level search to the object you tried to access
to read its <font face="Courier New">objectClass</font> attribute <em>before</em> it
executes any other searches to load the property cache and such.  ADSI uses this
information to determine which ADSI interfaces to make available.  By default,
you get the core interfaces like <font face="Courier New">IADs</font>, but you don’t
necessarily get one of the “persistent object” interfaces like <font face="Courier New">IADsUser</font> or <font face="Courier New">IADsGroup</font> unless
ADSI knows that it is a user or group.  Without those interfaces, you loose access
to members like <font face="Courier New">SetPassword</font> and <font face="Courier New">Add</font> (for
group membership additions).  
</p>
        <p>
The reason <font face="Courier New">FastBind</font> is called “Fast” is that this
initial search is done in addition to any searches to load the property cache, which
generally means that at least <em>two</em> base-level searches to the directory will
be required to load any given ADSI object (as you normally use the property cache
for something!).  All these extra searches add up to lots of network chatter
and can slow certain types of operations to a crawl.  
</p>
        <p>
Note that <font face="Courier New">FastBind</font> is an ADSI/SDS thing though and
has no bearing on how things work at the lower level LDAP level, as this notion of
the persistent object interfaces and property caches is an ADSI abstraction layer.
</p>
        <p>
          <font size="4">How to Implement Fast Concurrent Binding in SDS.P</font>
        </p>
        <p>
There really isn’t too much too this.  All you really need to do is turn this
option on <strong>BEFORE</strong> your LdapConnection actually connects to the directory
for the first time and you are all set.  Briefly, the code looks something like:
</p>
        <p>
          <font face="Courier New">_authConnect.SessionOptions.FastConcurrentBind();</font>
        </p>
        <p>
In order to get a more thorough look, I’ll simply point you to the LdapAuth.cs class
from our book’s website in ch 12 of the <a href="http://directoryprogramming.net/files/default.aspx">Full
Samples </a>to see this in real usage.  
</p>
        <p>
          <strong>Important Warning</strong>
          <br />
There is a bug in the actual implementation printed in the book (first printing at
least; assuming there will be more than one and we actually fix it ?).  <a href="http://dunnry.com/blog/FastConcurrentBindingInSDSP.aspx">A
small last minute blunder caused the defect</a>.  Please use the version in the
full samples from the website.
</p>
        <p>
          <strong>There are some important caveats as well:</strong>
        </p>
        <ul>
          <li>
            <em>Both the server and client must support FCB</em>.  In the book sample, we
actually check the server first via its <font face="Courier New">supportedCapabilities</font><font face="Courier New">RootDSE</font> attribute
to find the specific OID.  On the client requirements, be aware the SDS.P requires
the client code to be run on Windows 2003 server or higher.  XP and below does
not support this!  Our code tries to handle this gracefully, but you should plan
ahead anyway.</li>
          <li>
            <em>You are using simple bind, so you need plaintext usernames and passwords and must
use a user name syntax supported by simple bind</em>.  For AD, this is NT Account
Name (domain\user), UPN or DN.  For ADAM, this is generally UPN or DN, but actually
could be a lot of things like displayName as well.  Ch 3 of our book goes into
more detail.</li>
          <li>
This is simple bind.  <em>You MUST encrypt the network traffic with SSL or something!</em></li>
        </ul>
        <p>
          <font size="4">Conclusion</font>
        </p>
        <p>
We already covered most of this information in our book, but I don’t think we hit
all of these things in as much detail as I have covered here.  Additionally,
not all of you will buy the book and this isn’t in the free chapter, and we want you
to be successful with this somewhat mysterious feature, regardless.  Happy fast(er)
binding!<br /><em><font size="1"></font></em></p>
        <p>
          <em>
            <font size="1">* Of course, with all performance optimizations, always measure
and never assume.  Premature optimization is one of the seven deadly sins of
software engineering, yada-yada-yada.</font>
          </em>
        </p>
        <img width="0" height="0" src="http://www.joekaplan.net/aggbug.ashx?id=9b25d233-a484-4905-a60b-8bb8748c7068" />
      </body>
      <title>Using Fast Concurrent Binding in SDS.P</title>
      <guid isPermaLink="false">http://www.joekaplan.net/PermaLink,guid,9b25d233-a484-4905-a60b-8bb8748c7068.aspx</guid>
      <link>http://www.joekaplan.net/UsingFastConcurrentBindingInSDSP.aspx</link>
      <pubDate>Thu, 17 Aug 2006 18:05:52 GMT</pubDate>
      <description>&lt;p&gt;
&lt;font size=4&gt;Fast Concurrent Binding Overview&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
One of the things I alluded to in my &lt;a href="http://www.joekaplan.net/ATaleOfTwoLDAPStacks.aspx"&gt;post&lt;/a&gt; that
highlighted the differences in capabilities between the ADSI-based System.DirectoryServices
(SDS) namespace and the raw LDAP-based System.DirectoryServices.Protocols (SDS.P)
was the ability to access a feature called &lt;strong&gt;&lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ldap/ldap/using_ldap_for_password_authentication.asp?frame=true"&gt;Fast
Concurrent Binding (FCB)&lt;/a&gt;&lt;/strong&gt;.
&lt;/p&gt;
&lt;p&gt;
FCB is a feature available in Active Directory 2003 (and later) and in ADAM.&amp;nbsp;
To explain it, first let’s cover what happens with a “regular” bind operation in LDAP
against AD or ADAM.&amp;nbsp; With a normal bind, the user’s credentials are presented
to the LDAP server, either in plaintext format or via the Windows security model if
using a secure binding protocol.&amp;nbsp; The server then attempts to authenticate these
credentials.&amp;nbsp; If the credentials are accepted, then the server builds a Windows
token for the user which will be used to for performing security checks on future
operations and changes the state of the current LDAP connection to an authenticated
state so that future requests will continue to use the newly established security
context and this operation is not repeated.&amp;nbsp; This is the main reason why LDAP
connections are stateful.
&lt;/p&gt;
&lt;p&gt;
FCB eliminates two parts of this equation.&amp;nbsp; It authenticates the user’s credentials,
but it does not build a Windows token for the user and the connection state stays
anonymous.&amp;nbsp; As such, the bind operation will give you an “up/down” result based
on whether the user’s name and password were valid, but it won’t let you do anything
else with that connection such as perform searches, except as an anonymous user (which
is pretty limited by default in AD 2003 and ADAM).
&lt;/p&gt;
&lt;p&gt;
The big upside of FCB is that the bind operation is MUCH faster than a normal bind
because the really expensive operation, expanding the user’s group membership to build
the token, is eliminated.&amp;nbsp; Hence the name&amp;nbsp;&lt;em&gt;&lt;strong&gt;fast&lt;/strong&gt; concurrent
binding&lt;/em&gt;.&lt;sup&gt;*&lt;/sup&gt;
&lt;/p&gt;
&lt;p&gt;
The concurrent part comes from the fact that multiple users can be authenticated on
the same LDAP connection simultaneously without worrying about changing the authenticated
state of the connection, so the expense of setting up and tearing down the associated
socket can also be eliminated.&amp;nbsp; This makes it potentially even faster.
&lt;/p&gt;
&lt;p&gt;
The big downside with FCB is that it only supports LDAP simple bind, not SASL, and
simple bind does not have a built in mechanism for protecting the credentials on the
wire like the various SASL mechanisms do.&amp;nbsp; &lt;strong&gt;As such, it is never safe
to use FCB unless some form of transport security is used such as SSL or IPSEC!&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font size=4&gt;When to Use Fast Concurrent Binding&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Do&lt;/strong&gt; use FCB when your application is doing pure authentication of
credentials via LDAP.&amp;nbsp; An example of this might be in a web-based application
that uses AD or ADAM as a user store and does LDAP authentication.&amp;nbsp; If you just
need a “yes/no” vote as to whether a username/password combo is good, FCB will give
you the best performance and may add a significant scalability increase to your application
as a result.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Do not&lt;/strong&gt; use FCB if you need to authenticate and then perform operations
against the directory on the user’s behalf (a delegation scenario from the architectural
perspective, although not necessarily using Windows Kerberos delegation features to
implement it).&amp;nbsp; Since the connection state does not change to “authenticated”,
the user’s credentials will not be used to perform subsequent operations and you won’t
get what you want.
&lt;/p&gt;
&lt;p&gt;
An obvious place where you might want to use FCB would be in something like the ActiveDirectoryMembershipProvider
in ASP.NET 2.0.&amp;nbsp; My understanding is that the development already thought about
this and tried to add this support already.&amp;nbsp; Thus, you may already have this
and not even know it!
&lt;/p&gt;
&lt;p&gt;
Another obvious place for this to be used would be in ADFS for authenticating users
in the ADAM store and potentially with users in the AD store as well when used with
the Federation Service Proxy (which accepts credentials via a forms or basic auth
interface in plaintext form).&amp;nbsp; As of this writing, I do not believe that ADFS
is taking advantage of this feature (or and SDS.P capabilities for that matter).&amp;nbsp;
Note to product team…
&lt;/p&gt;
&lt;p&gt;
&lt;font size=4&gt;A Note on ADSI/SDS and Fast Concurrent Binding&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Hey Joe, I see that ADSI and SDS have an &lt;font face="Courier New"&gt;AuthenticationTypes&lt;/font&gt; flag
called &lt;font face="Courier New"&gt;FastBind&lt;/font&gt;.&amp;nbsp; Can’t I just use that to get
FCB?&amp;nbsp; Why are you telling me this requires SDS.P?&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
The answer here is “no”, they are not the same thing, despite their unfortunately
similar names!&amp;nbsp; &lt;font face="Courier New"&gt;&lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/adsi/adsi/fast_binding_option_for_batch_writemodify_operations.asp?frame=true"&gt;FastBind&lt;/a&gt;&lt;/font&gt; in
ADSI/SDS actually has nothing to do with the bind operation per say, but has to do
with what ADSI does after the bind when you go to access an object.&amp;nbsp; With &lt;font face="Courier New"&gt;FastBind&lt;/font&gt; NOT
set (the default), ADSI does a base-level search to the object you tried to access
to read its &lt;font face="Courier New"&gt;objectClass&lt;/font&gt; attribute &lt;em&gt;before&lt;/em&gt; it
executes any other searches to load the property cache and such.&amp;nbsp; ADSI uses this
information to determine which ADSI interfaces to make available.&amp;nbsp; By default,
you get the core interfaces like &lt;font face="Courier New"&gt;IADs&lt;/font&gt;, but you don’t
necessarily get one of the “persistent object” interfaces like &lt;font face="Courier New"&gt;IADsUser&lt;/font&gt; or &lt;font face="Courier New"&gt;IADsGroup&lt;/font&gt; unless
ADSI knows that it is a user or group.&amp;nbsp; Without those interfaces, you loose access
to members like &lt;font face="Courier New"&gt;SetPassword&lt;/font&gt; and &lt;font face="Courier New"&gt;Add&lt;/font&gt; (for
group membership additions).&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
The reason &lt;font face="Courier New"&gt;FastBind&lt;/font&gt; is called “Fast” is that this
initial search is done in addition to any searches to load the property cache, which
generally means that at least &lt;em&gt;two&lt;/em&gt; base-level searches to the directory will
be required to load any given ADSI object (as you normally use the property cache
for something!).&amp;nbsp; All these extra searches add up to lots of network chatter
and can slow certain types of operations to a crawl.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
Note that &lt;font face="Courier New"&gt;FastBind&lt;/font&gt; is an ADSI/SDS thing though and
has no bearing on how things work at the lower level LDAP level, as this notion of
the persistent object interfaces and property caches is an ADSI abstraction layer.
&lt;/p&gt;
&lt;p&gt;
&lt;font size=4&gt;How to Implement Fast Concurrent Binding in SDS.P&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
There really isn’t too much too this.&amp;nbsp; All you really need to do is turn this
option on &lt;strong&gt;BEFORE&lt;/strong&gt; your LdapConnection actually connects to the directory
for the first time and you are all set.&amp;nbsp; Briefly, the code looks something like:
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;_authConnect.SessionOptions.FastConcurrentBind();&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
In order to get a more thorough look, I’ll simply point you to the LdapAuth.cs class
from our book’s website in ch 12 of the &lt;a href="http://directoryprogramming.net/files/default.aspx"&gt;Full
Samples &lt;/a&gt;to see this in real usage.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Important Warning&lt;/strong&gt;
&lt;br&gt;
There is a bug in the actual implementation printed in the book (first printing at
least; assuming there will be more than one and we actually fix it ?).&amp;nbsp; &lt;a href="http://dunnry.com/blog/FastConcurrentBindingInSDSP.aspx"&gt;A
small last minute blunder caused the defect&lt;/a&gt;.&amp;nbsp; Please use the version in the
full samples from the website.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;There are some important caveats as well:&lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Both the server and client must support FCB&lt;/em&gt;.&amp;nbsp; In the book sample, we
actually check the server first via its &lt;font face="Courier New"&gt;supportedCapabilities&lt;/font&gt; &lt;font face="Courier New"&gt;RootDSE&lt;/font&gt; attribute
to find the specific OID.&amp;nbsp; On the client requirements, be aware the SDS.P requires
the client code to be run on Windows 2003 server or higher.&amp;nbsp; XP and below does
not support this!&amp;nbsp; Our code tries to handle this gracefully, but you should plan
ahead anyway.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;You are using simple bind, so you need plaintext usernames and passwords and must
use a user name syntax supported by simple bind&lt;/em&gt;.&amp;nbsp; For AD, this is NT Account
Name (domain\user), UPN or DN.&amp;nbsp; For ADAM, this is generally UPN or DN, but actually
could be a lot of things like displayName as well.&amp;nbsp; Ch 3 of our book goes into
more detail.&lt;/li&gt;
&lt;li&gt;
This is simple bind.&amp;nbsp; &lt;em&gt;You MUST encrypt the network traffic with SSL or something!&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;font size=4&gt;Conclusion&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
We already covered most of this information in our book, but I don’t think we hit
all of these things in as much detail as I have covered here.&amp;nbsp; Additionally,
not all of you will buy the book and this isn’t in the free chapter, and we want you
to be successful with this somewhat mysterious feature, regardless.&amp;nbsp; Happy fast(er)
binding!&lt;br&gt;
&lt;em&gt;&lt;font size=1&gt;&lt;/font&gt;&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;&lt;font size=1&gt;* Of course, with all performance optimizations, always measure and
never assume.&amp;nbsp; Premature optimization is one of the seven deadly sins of software
engineering, yada-yada-yada.&lt;/font&gt;&lt;/em&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.joekaplan.net/aggbug.ashx?id=9b25d233-a484-4905-a60b-8bb8748c7068" /&gt;</description>
      <comments>http://www.joekaplan.net/CommentView,guid,9b25d233-a484-4905-a60b-8bb8748c7068.aspx</comments>
      <category>Application Architecture;LDAP;Windows Security</category>
    </item>
    <item>
      <trackback:ping>http://www.joekaplan.net/Trackback.aspx?guid=e226874d-37e0-4d15-a9a8-646c1a4471b3</trackback:ping>
      <pingback:server>http://www.joekaplan.net/pingback.aspx</pingback:server>
      <pingback:target>http://www.joekaplan.net/PermaLink,guid,e226874d-37e0-4d15-a9a8-646c1a4471b3.aspx</pingback:target>
      <dc:creator>Joe Kaplan</dc:creator>
      <wfw:comment>http://www.joekaplan.net/CommentView,guid,e226874d-37e0-4d15-a9a8-646c1a4471b3.aspx</wfw:comment>
      <wfw:commentRss>http://www.joekaplan.net/SyndicationService.asmx/GetEntryCommentsRss?guid=e226874d-37e0-4d15-a9a8-646c1a4471b3</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
In a newsgroup thread today, <a href="http://staceyw.spaces.live.com/">William Stacey</a> taught
me some stuff about salted password hashes stored in a traditional relational database. 
Apparently, this is not the way the cool kids do it anymore (although MS still has
plenty of guidance suggesting to use this approach).  Apparently, the those in
the know use an implementation like <a href="http://srp.stanford.edu/">Secure Remote
Password (SRP-6a)</a>.
</p>
        <p>
William couldn't find a .NET implementation, so he built one!  You can find his
implementation <a href="http://channel9.msdn.com/ShowPost.aspx?PostID=107763">here</a>.
</p>
        <img width="0" height="0" src="http://www.joekaplan.net/aggbug.ashx?id=e226874d-37e0-4d15-a9a8-646c1a4471b3" />
      </body>
      <title>William Stacey Builds an SRP-6a .NET Implementation</title>
      <guid isPermaLink="false">http://www.joekaplan.net/PermaLink,guid,e226874d-37e0-4d15-a9a8-646c1a4471b3.aspx</guid>
      <link>http://www.joekaplan.net/WilliamStaceyBuildsAnSRP6aNETImplementation.aspx</link>
      <pubDate>Thu, 10 Aug 2006 02:52:50 GMT</pubDate>
      <description>&lt;p&gt;
In a newsgroup thread today, &lt;a href="http://staceyw.spaces.live.com/"&gt;William Stacey&lt;/a&gt; taught
me some stuff about salted password hashes stored in a traditional relational database.&amp;nbsp;
Apparently, this is not the way the cool kids do it anymore (although MS still has
plenty of guidance suggesting to use this approach).&amp;nbsp; Apparently, the those in
the know use an implementation like &lt;a href="http://srp.stanford.edu/"&gt;Secure Remote
Password (SRP-6a)&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
William couldn't find a .NET implementation, so he built one!&amp;nbsp; You can find his
implementation &lt;a href="http://channel9.msdn.com/ShowPost.aspx?PostID=107763"&gt;here&lt;/a&gt;.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.joekaplan.net/aggbug.ashx?id=e226874d-37e0-4d15-a9a8-646c1a4471b3" /&gt;</description>
      <comments>http://www.joekaplan.net/CommentView,guid,e226874d-37e0-4d15-a9a8-646c1a4471b3.aspx</comments>
      <category>Application Architecture;Cryptography;Windows Security</category>
    </item>
    <item>
      <trackback:ping>http://www.joekaplan.net/Trackback.aspx?guid=ac8e564c-1b19-44e7-9ab0-6a4ef74bd614</trackback:ping>
      <pingback:server>http://www.joekaplan.net/pingback.aspx</pingback:server>
      <pingback:target>http://www.joekaplan.net/PermaLink,guid,ac8e564c-1b19-44e7-9ab0-6a4ef74bd614.aspx</pingback:target>
      <dc:creator>Joe Kaplan</dc:creator>
      <wfw:comment>http://www.joekaplan.net/CommentView,guid,ac8e564c-1b19-44e7-9ab0-6a4ef74bd614.aspx</wfw:comment>
      <wfw:commentRss>http://www.joekaplan.net/SyndicationService.asmx/GetEntryCommentsRss?guid=ac8e564c-1b19-44e7-9ab0-6a4ef74bd614</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I've been telling myself I was going to finally get into the blogging racket for almost
2 years now, but even though I've had the hosting all put together for that entire
time, it took me forever to actually get it together.  I just had to do it myself
instead of using another site...
</p>
        <p>
Anyway, this blog will probably resemble the blogs I already read, in that it will
be mostly technical with a focus on building software using Microsoft's .NET platform. 
It will probably lean heavily on my specialties, .NET LDAP programming and application
security, but will likely also feature other stuff I'm into like application architecture,
agile development, identity federation, cryptography, and setup development in MSI
using <a href="http://wix.sourceforge.net">WiX</a>.  
</p>
        <p>
Speaking of .NET and LDAP, if you've ever heard of me before, it is most likely because
you might have stumbled across one of the myriad usenet posts I've made over the last
4-5 years on the Microsoft newsgroups, or perhaps I answered your question directly. 
Micrsosoft has actually designated me an <a href="http://mvp.support.microsoft.com">MVP</a> in
this area, and I've even written a <a href="http://www.directoryprogramming.net">book</a> about
this with my intrepid co-author, <a href="http://www.dunnry.com/blog">Ryan Dunn</a>,
to further our aim of providing resources for the .NET community in this obscure,
but stranglely difficult and increasingly important aspect of software development.
</p>
        <p>
That's all for now.  Maybe some real content next time, eh?
</p>
        <img width="0" height="0" src="http://www.joekaplan.net/aggbug.ashx?id=ac8e564c-1b19-44e7-9ab0-6a4ef74bd614" />
      </body>
      <title>About time...</title>
      <guid isPermaLink="false">http://www.joekaplan.net/PermaLink,guid,ac8e564c-1b19-44e7-9ab0-6a4ef74bd614.aspx</guid>
      <link>http://www.joekaplan.net/AboutTime.aspx</link>
      <pubDate>Sun, 30 Jul 2006 15:25:14 GMT</pubDate>
      <description>&lt;p&gt;
I've been telling myself I was going to finally get into the blogging racket for almost
2 years now, but even though I've had the hosting all put together for that entire
time, it took me forever to actually get it together.&amp;nbsp; I just had to do it myself
instead of using another site...
&lt;/p&gt;
&lt;p&gt;
Anyway, this blog will probably resemble the blogs I already read, in that it will
be mostly technical with a focus on building software using Microsoft's .NET platform.&amp;nbsp;
It will probably lean heavily on my specialties, .NET LDAP programming and&amp;nbsp;application
security, but will likely also feature other stuff I'm into like application architecture,
agile development, identity federation, cryptography, and setup development in MSI
using &lt;a href="http://wix.sourceforge.net"&gt;WiX&lt;/a&gt;.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
Speaking of .NET and LDAP, if you've ever heard of me before, it is most likely because
you might have stumbled across one of the myriad usenet posts I've made over the last
4-5 years on the Microsoft newsgroups, or perhaps I answered your question directly.&amp;nbsp;
Micrsosoft has actually designated me an &lt;a href="http://mvp.support.microsoft.com"&gt;MVP&lt;/a&gt; in
this area, and I've even written a &lt;a href="http://www.directoryprogramming.net"&gt;book&lt;/a&gt; about
this with my intrepid co-author, &lt;a href="http://www.dunnry.com/blog"&gt;Ryan Dunn&lt;/a&gt;,
to further our aim of providing resources for the .NET community in this obscure,
but stranglely difficult and increasingly important aspect of software development.
&lt;/p&gt;
&lt;p&gt;
That's all for now.&amp;nbsp; Maybe some real content next time, eh?
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.joekaplan.net/aggbug.ashx?id=ac8e564c-1b19-44e7-9ab0-6a4ef74bd614" /&gt;</description>
      <comments>http://www.joekaplan.net/CommentView,guid,ac8e564c-1b19-44e7-9ab0-6a4ef74bd614.aspx</comments>
      <category>General;LDAP;Windows Security;WiX;Identity Federation;Cryptography;Agile;Application Architecture;Software Engineering</category>
    </item>
  </channel>
</rss>