When manually creating the User "janedoe" in the ASPNETDB I did not populate the @PasswordSalt parameter, and the @PasswordFormat parameter was set to 0.
I definitely included the -ClearTextPassword option in the New-AxUser cmdlet used to create "johndoe", so perhaps that's not working properly?
In trying to understand how FBA works I've been examining the SQLMemberShipProvider in the following resource: msdn.microsoft.com/.../ff648345.aspx
I notice the FormsAuth web.config includes Hash Config key being added:
<!--
Override for system.web/membership:hashAlgorithmType of web.config.
WARNING!:
Unless this is done before any user is created, modifying this
may result in existing users not being able to authenticate
using forms-based authentication. Currently there is no support
for automatic migration if switching hash algorithms.
-->
<add key="hashAlgorithmType" value="SHA1" />
</appSettings>
**********************
The original STS Web.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<!-- Behavior List: -->
<behaviors>
<serviceBehaviors>
<behavior name="SecurityTokenServiceBehavior" >
<!-- The serviceMetadata behavior allows one to enable metadata (endpoints, bindings, services) publishing.
This configuration enables publishing of such data over HTTP GET.
This does not include metadata about the STS itself such as Claim Types, Keys and other elements to establish a trust.
-->
<serviceMetadata httpGetEnabled="true" />
<!-- Default WCF throttling limits are too low -->
<serviceThrottling maxConcurrentCalls="65536" maxConcurrentSessions="65536" maxConcurrentInstances="65536" />
</behavior>
<behavior name="ApplicationSecurityTokenServiceBehavior" >
<serviceMetadata httpGetEnabled="false" httpsGetEnabled="false" />
<serviceThrottling maxConcurrentCalls="65536" maxConcurrentSessions="65536" maxConcurrentInstances="65536" />
</behavior>
</serviceBehaviors>
</behaviors>
<!-- Service List: -->
<services>
<service name="Microsoft.IdentityModel.Protocols.WSTrust.WSTrustServiceContract"
behaviorConfiguration="SecurityTokenServiceBehavior" >
<!-- This is the HTTP endpoint that supports clients requesing tokens. This endpoint uses the default
standard ws2007HttpBinding which requires that clients authenticate using their Windows credentials. -->
<endpoint
address=""
binding="customBinding"
bindingConfiguration="spStsBinding"
contract="Microsoft.IdentityModel.Protocols.WSTrust.IWSTrust13SyncContract" />
<!-- This is the HTTP endpoint that supports clients requesting service tokens. -->
<endpoint
name ="ActAs"
address="actas"
binding="customBinding"
bindingConfiguration="spStsActAsBinding"
contract="Microsoft.IdentityModel.Protocols.WSTrust.IWSTrust13SyncContract" />
<!-- This is the HTTP endpoint that supports IMetadataExchange. -->
<endpoint address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange" />
</service>
<service
name="Microsoft.SharePoint.IdentityModel.ApplicationSecurityTokenService"
behaviorConfiguration="ApplicationSecurityTokenServiceBehavior">
<endpoint
name="app"
address=""
binding="customBinding"
bindingConfiguration="spStsApplicationBinding"
contract="Microsoft.SharePoint.IdentityServices.IApplicationSecurityTokenServiceContract" />
</service>
<service name="Microsoft.SharePoint.Administration.Claims.SPWindowsTokenCacheService">
<endpoint address=""
binding="customBinding"
bindingConfiguration="SPWindowsTokenCacheServiceHttpsBinding"
contract="Microsoft.SharePoint.Administration.Claims.ISPWindowsTokenCacheServiceContract" />
</service>
</services>
<!-- Binding List: -->
<bindings>
<customBinding>
<binding
name="spStsBinding">
<binaryMessageEncoding>
<readerQuotas
maxStringContentLength="1048576"
maxArrayLength="2097152"/>
</binaryMessageEncoding>
<httpTransport
maxReceivedMessageSize="2162688"
authenticationScheme="Negotiate"
useDefaultWebProxy="false" />
</binding>
<binding
name="spStsActAsBinding">
<security
authenticationMode="SspiNegotiatedOverTransport"
allowInsecureTransport="true"
defaultAlgorithmSuite="Basic256Sha256"
messageSecurityVersion="WSSecurity11WSTrust13WSSecureConversation13WSSecurityPolicy12" />
<binaryMessageEncoding>
<readerQuotas
maxStringContentLength="1048576"
maxArrayLength="2097152"/>
</binaryMessageEncoding>
<httpTransport
maxReceivedMessageSize="2162688"
authenticationScheme="Negotiate"
useDefaultWebProxy="false"/>
</binding>
<binding
name="spStsApplicationBinding">
<binaryMessageEncoding>
<readerQuotas
maxStringContentLength="1048576"
maxArrayLength="2097152" />
</binaryMessageEncoding>
<namedPipeTransport
maxPendingAccepts="250"
maxPendingConnections="250"
maxReceivedMessageSize="2162688">
<connectionPoolSettings
idleTimeout="00:30:00"
maxOutboundConnectionsPerEndpoint="250"/>
</namedPipeTransport>
</binding>
<binding name="SPWindowsTokenCacheServiceHttpsBinding">
<security
authenticationMode="IssuedTokenOverTransport"
defaultAlgorithmSuite="Basic256Sha256" />
<textMessageEncoding>
<readerQuotas maxStringContentLength="1048576" maxArrayLength="2097152"/>
</textMessageEncoding>
<httpsTransport maxReceivedMessageSize="2162688" authenticationScheme="Anonymous" useDefaultWebProxy="false" />
</binding>
</customBinding>
</bindings>
</system.serviceModel>
<system.webServer>
<security>
<authentication>
<anonymousAuthentication enabled="true" />
<windowsAuthentication enabled="true">
<providers>
<clear />
<add value="Negotiate" />
<add value="NTLM" />
</providers>
</windowsAuthentication>
</authentication>
</security>
<modules>
<add name="WindowsAuthenticationModule" />
</modules>
</system.webServer>
<system.net>
<connectionManagement>
<clear />
<add address="*" maxconnection="10000" />
</connectionManagement>
</system.net>
</configuration>
In troubleshooting we added:
<connectionStrings>
<add name="FormsAuth" connectionString="Initial Catalog=aspnetdb;data source=[server\instance]l;Integrated Security=SSPI;" />
</connectionStrings>
<system.web>
<roleManager>
<providers>
<add name="aspnetrolemanager" type="System.Web.Security.SqlRoleProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
connectionStringName="FormsAuth" applicationName="/" />
</providers>
</roleManager>
<membership>
<providers>
<add name="aspnetmembership" connectionStringName="FormsAuth" applicationName="/" type="System.Web.Security.SqlMembershipProvider, System.Web, Version=4.0.0.0, Culture=neutral, passwordFormat="Hashed", PublicKeyToken=b03f5f7f11d50a3a" />
</providers>
</membership>
</system.web>
This did not resolve the authentication issue with the "johndoe" user, but the passwordFormat="Hashed", affected authentication from "janedoe" resulting in a runtime error. As soon as it was removed it worked. I also tried passwordFormat="Encrypted", more runtime errors.
*********************************
The machine.config located in \Windows\Microsoft.Net\Framework\v2.x\Config
<system.web>
<processModel autoConfig="true"/>
<httpHandlers/>
<membership>
<providers>
<add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="LocalSqlServer" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="true" applicationName="/" requiresUniqueEmail="false" passwordFormat="Hashed" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="7" minRequiredNonalphanumericCharacters="1" passwordAttemptWindow="10" passwordStrengthRegularExpression=""/>
</providers>
</membership>