asp.net - 我的 Membership ValidateUser 请求有什么问题? (使用 ClientFormsAuthenticationMembershipProvider)

标签 asp.net vb.net authentication asp.net-membership membership

是否可以运行任何简单的诊断来确定身份验证为何无法与 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>

我有另一个网站(称为“测试客户端”网站)托管在与服务器 A 位于同一网络的服务器 B 上,但我确实知道服务器 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 向服务器 A 发出 http 请求。当 ClientFormsAuthenticationMembershipProvider 尝试从服务器 B 向服务器 A 发出(我认为是)JSON 请求时失败,这是怎么回事?

编辑(2009 年 9 月 21 日):

我现在已经在同一个盒子(不是我的开发机器)上使用身份验证网站和测试客户端尝试了这种情况。它仍然失败。我以编程方式编写了一个原始 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,为什么要在客户端本地尝试执行任何操作?而且,我需要运行什么实用程序才能将这些新表/对象添加到我的数据库中以支持客户端成员资格提供程序?

最佳答案

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

根据this MSDN article ,您可以配置本地离线缓存以使用数据库。您必须按照本文中的指定手动创建数据库表(在我的 9/22 编辑中,我尚未创建这些表,并且没有实用程序可以执行此操作)。我这样做了,但客户端仍然希望在本地计算机上为本地 SQL CE 文件创建文件夹结构,即使它永远不会创建这样的文件。对于我测试中的每台计算机(除了我的本地工作站),IIS 用户无权为本地缓存数据库构建该文件夹结构,这会生成 UnauthorizedAccessException。

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

关于asp.net - 我的 Membership ValidateUser 请求有什么问题? (使用 ClientFormsAuthenticationMembershipProvider),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1348850/

相关文章:

asp.net - Telerik RadComboBox javascript API 问题

vb.net - 如何在 vb.net 中将数据网格保存为 excel?

vb.net - 如何创建包含双引号的变量

authentication - 将 azure AD 身份验证与 asp.net core 身份个人帐户集成

python - Django 如果 user.is_authenticated 不工作

c# - 如何异步渲染局部 View

c# - ASP.NET Web 应用程序无法使用自定义 Bootstrap 正确显示内容

MySQL查询另一个表中不存在的情况

php - Facebook 自动登录身份验证

c# - 多个复选框列表