2

是否有任何简单的诊断可以运行以确定为什么身份验证不与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,为什么在客户端本地尝试了任何东西?而且,我需要运行哪些实用程序来将这些新的表/对象添加到我的数据库中以支持客户端成员资格提供程序?

回答

2

的ClientAuthenticationMembershipProvider具有离线缓存功能。如果无法访问实际的成员资格提供程序,则客户端成员资格提供程序可以在客户端计算机上缓存凭据并使用这些脱机凭据。此脱机缓存由自动生成并存储在System.Windows.Forms.Application.UserAppDataPath位置中的SQL Server Compact Edition数据库文件表示。

根据this MSDN article,您可以配置本地脱机缓存以使用数据库。您必须手动创建文章中指定的数据库表(在我的9/22编辑中,我还没有创建这些表,并且没有实用工具可以这样做)。我这样做了,但客户仍希望在本地机器上为本地SQL CE文件创建文件夹结构,即使它永远不会创建这样的文件。除了我的本地工作站之外,对于我测试的每台计算机,IIS用户都无权访问为本地缓存数据库生成该文件夹结构,该数据库生成UnauthorizedAccessException。

我很不满意A)没有配置键来关闭成员资格的脱机缓存,B)即使将脱机缓存指向数据库时,客户端成员资格提供程序仍然必须生成一个文件夹路径它永远不会创建的本地缓存文件。

0

如果您将system.diagnostic标记添加到您的web.config文件中,它将起作用。 (我来到这里只有一个空文件,但还没有一个错误信息。)

<system.diagnostics> 
     <sources> 
      <!-- This section defines the logging configuration for My.Application.Log --> 
      <source name="DefaultSource" switchName="DefaultSwitch"> 
       <listeners> 
        <add name="myListener"/> 
        <!-- Uncomment the below section to write to the Application Event Log --> 
        <!--<add name="EventLog"/>--> 
       </listeners> 
      </source> 
     </sources> 
     <switches> 
      <add name="DefaultSwitch" value="Information" /> 
     </switches> 
     <sharedListeners> 
      <add name="myListener" 
         type="System.Diagnostics.TextWriterTraceListener" 
         initializeData="c:\temp\MyFile.log" /> 
      <!-- Uncomment the below section and replace APPLICATION_NAME with the name of your application to write to the Application Event Log --> 
      <!--<add name="EventLog" type="System.Diagnostics.EventLogTraceListener" initializeData="APPLICATION_NAME"/> --> 
     </sharedListeners> 
    </system.diagnostics> 
+0

非常好 - 我会试试看。谢谢。 – 2009-09-16 15:32:49

+0

我已将此web.config节点添加到身份验证服务器应用程序和测试应用程序。我也打开了事件日志。没有消息出现在事件日志中,并且在C:\ temp中没有创建任何文件。 – 2009-09-21 20:03:17