是否有任何简单的诊断可以运行以确定为什么身份验证不与ClientFormsAuthenticationMembershipProvider提供程序一起工作?我的问题:我的Membership ValidateUser请求有什么问题? (使用ClientFormsAuthenticationMembershipProvider)
我有一个网站(我们称之为“身份验证器”网站)在服务器A上托管,该服务器配置为使用AspNetSqlMembershipProvider提供程序进行成员资格和角色管理。该网站的(我认为是)相关的web.config键是这些:
<membership>
<providers>
<clear />
<add name="AspNetSqlMembershipProvider"
type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
connectionStringName="MMMS35.API"
enablePasswordRetrieval="false"
enablePasswordReset="true"
requiresQuestionAndAnswer="false"
applicationName="Moose"
requiresUniqueEmail="false"
passwordFormat="Hashed"
maxInvalidPasswordAttempts="5"
minRequiredPasswordLength="7"
minRequiredNonalphanumericCharacters="0"
passwordAttemptWindow="1"
passwordStrengthRegularExpression="" />
</providers>
</membership>
<profile>
<providers>
<clear />
<add name="AspNetSqlProfileProvider"
connectionStringName="MMMS35.API"
applicationName="Moose"
type="System.Web.Profile.SqlProfileProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
</providers>
</profile>
<roleManager enabled="true">
<providers>
<clear />
<add name="AspNetSqlRoleProvider"
connectionStringName="MMMS35.API"
applicationName="Moose"
type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
</providers>
</roleManager>
我有另一个网站(称为“测试客户端”网站)托管在服务器B在同一网络上的服务器A,但是我确实知道服务器A & B之间的网络路径,路由器配置等等。测试客户端具有模拟登录设置,该设置使用ClientFormsAuthenticationMembershipProvider提供者来请求“认证者”网站进行认证测试客户端上给出的凭证。测试客户端的相关的web.config部分是这些:
<membership defaultProvider="ClientAuthenticationMembershipProvider">
<providers>
<clear/>
<add name="ClientAuthenticationMembershipProvider"
type="System.Web.ClientServices.Providers.ClientFormsAuthenticationMembershipProvider, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
serviceUri="http://slmooseapp1/mia/Authentication_JSON_AppService.axd"
credentialsProvider=""
savePasswordHashLocally="False"/>
</providers>
</membership>
<roleManager defaultProvider="ClientRoleProvider" enabled="true">
<providers>
<clear/>
<add name="ClientRoleProvider"
type="System.Web.ClientServices.Providers.ClientRoleProvider, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
serviceUri="http://slmooseapp1/mia/Role_JSON_AppService.axd"
cacheTimeout="1"/>
</providers>
</roleManager>
当测试客户端执行这一行:
DirectCast(Membership.Provider, ClientServices.Providers.ClientFormsAuthenticationMembershipProvider).ValidateUser(UserName.Text, Password.Text)
我得到一个异常:
System.UnauthorizedAccessException: Access to the path 'C:\Documents and Settings\Default User\Application Data\Microsoft Corporation\Internet Information Services\6.0.3790.3959' is denied.
然而,当我使用完全相同的web.config serviceUri路径(即,我的客户端成员资格提供程序指向服务器A上的相同身份验证网站)在我的开发框(而不是服务器B上)上运行测试客户端,验证用户和获得该用户的角色完美地工作。
如果我打开服务器B上的浏览器,并从身份验证的网站请求页面时,验证Web应用程序运行正常,所以我知道我可以从服务器B的HTTP请求到服务器A成功。当ClientFormsAuthenticationMembershipProvider尝试创建(我认为是)从服务器B到服务器A的JSON请求时,会发生什么情况?
EDIT(9/21/2009):
现在我已经试过这种情况下与身份验证的网站,并在同一台测试客户端(这是不是我的开发机)。它仍然失败。我写编程原始HTTP请求并没有得到成功的响应...
请求:
Content-Type: application/json
Host: slappdev
Content-Length: 70
Expect: 100-continue
Connection: Keep-Alive
{"userName":"mdh","password":"test123","createPersistentCookie":false}
响应:
MicrosoftOfficeWebServer: 5.0_Pub
Content-Length: 10
Cache-Control: private, max-age=0
Content-Type: application/json; charset=utf-8
Date: Mon, 21 Sep 2009 20:10:13 GMT
Set-Cookie: AppName=1756811D52C4619AC78...; path=/; HttpOnly
Server: Microsoft-IIS/6.0
X-AspNet-Version: 2.0.50727
X-Powered-By: ASP.NET
{"d":true}
所以,我的猜测是,什么是错的,通过工作时.Net框架调用从ValidateUser获取实际的HTTP请求。有任何想法吗?
编辑(2009/9/22):
引发的异常被抛出时,我的测试客户端的网页试图访问System.Windows.Forms.Application.UserAppDataPath作为完全相同的例外。将connectionStringName属性添加到指向客户端Web应用程序的web.config文件中的有效连接字符串名称的membership/providers/add键会更改异常!
System.Data.SqlClient.SqlException: Invalid object name 'ApplicationProperties'. at System.Data.SqlClient.SqlConnection.OnError
因此,如果所有的成员函数都使用serviceUri,为什么在客户端本地尝试了任何东西?而且,我需要运行哪些实用程序来将这些新的表/对象添加到我的数据库中以支持客户端成员资格提供程序?
非常好 - 我会试试看。谢谢。 – 2009-09-16 15:32:49
我已将此web.config节点添加到身份验证服务器应用程序和测试应用程序。我也打开了事件日志。没有消息出现在事件日志中,并且在C:\ temp中没有创建任何文件。 – 2009-09-21 20:03:17