2

인증이 ClientFormsAuthenticationMembershipProvider 공급자와 작동하지 않는 이유를 확인하기 위해 실행할 수있는 간단한 진단이 있습니까? 내 문제 :회원 유효성 검사 사용자 요청에 어떤 문제가 있습니까? (ClientFormsAuthenticationMembershipProvider 사용)

회원 및 역할 관리 모두에 AspNetSqlMembershipProvider 공급자를 사용하도록 구성된 서버 A에서 호스팅되는 웹 사이트 ("인증 자"웹 사이트라고합니다)가 있습니다.

<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에서 호스팅 : 해당 웹 사이트에 대한 (내가 생각하는 것은) 관련 Web.config의 키는이 있습니다 서버 A이지만 서버 A & 사이에 네트워크 경로, 라우터 구성 등이 무엇인지 알 수 있습니다. 테스트 클라이언트에는 ClientFormsAuthenticationMembershipProvider 공급자를 사용하여 "인증 자"웹 사이트에 인증을 요청하는 모의 로그인 설정이 있습니다 테스트 클라이언트에 제공된 자격 증명. 테스트 클라이언트의 관련 Web.config의 섹션이 있습니다, 그러나

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. 

:

DirectCast(Membership.Provider, ClientServices.Providers.ClientFormsAuthenticationMembershipProvider).ValidateUser(UserName.Text, Password.Text) 

내가 예외가 : 테스트 클라이언트이 줄을 실행

<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> 

정확히 동일한 web.config serviceUri 경로 (예 : 내 클라이언트 멤버 자격 공급자가 서버 A의 동일한 인증 웹 사이트를 가리키고 있음)를 사용하여 개발 상자 (서버 B가 아님)에서 테스트 클라이언트를 실행하고 사용자에 대한 역할을 얻는 것은 완벽하게 작동합니다.

서버 B에서 브라우저를 열고 인증 웹 사이트에서 페이지를 요청하면 인증 웹 앱이 제대로 실행되므로 서버 B에서 서버 A로 http 요청을 성공적으로 수행 할 수 있음을 알게됩니다. 서버 폼 B에서 서버 A로 JSON 요청을 만들려고 할 때 실패하는 ClientFormsAuthenticationMembershipProvider는 어떻게됩니까?

EDIT (2009년 9월 21일) : 나는 인증 웹 사이트 (내 개발 시스템이 아닌) 같은 상자에서 테스트 클라이언트와 지금이 시나리오를 시도했습니다

. 그것은 여전히 ​​실패합니다. 나는 ... 프로그램 원시 HTTP 요청을 쓴 성공적인 응답을받을 DID

요청 :

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에 액세스를 시도 할 때 같이 던져 동일한 예외입니다. 클라이언트 웹 응용 프로그램의 web.config 파일에서 유효한 연결 문자열 이름을 가리키는 membership/providers/add 키에 connectionStringName 특성을 추가하면 예외가 변경됩니다!

따라서 모든 회원 기능이 serviceUri를 사용하고 있다면 클라이언트에서 로컬로 시도되는 이유는 무엇입니까? 그리고 클라이언트 멤버십 공급자를 지원하기 위해 이러한 새 테이블/개체를 데이터베이스에 추가하려면 어떤 유틸리티를 실행해야합니까?

답변

2

ClientAuthenticationMembershipProvider 오프라인 캐시 기능이 있습니다. 실제 멤버 자격 공급자에 연결할 수없는 경우 클라이언트 멤버 자격 공급자는 클라이언트 컴퓨터에서 자격 증명을 캐시하고 해당 오프라인 자격 증명을 사용할 수 있습니다. 이 오프라인 캐시는 System.Windows.Forms.Application.UserAppDataPath 위치에 자동으로 생성되어 저장되는 SQL Server Compact Edition 데이터베이스 파일로 표현됩니다.

this MSDN article에 따르면 데이터베이스를 사용하도록 로컬 오프라인 캐시를 구성 할 수 있습니다. 아티클에 지정된대로 데이터베이스 테이블을 수동으로 만들어야합니다 (9/22 편집에서 해당 테이블을 아직 만들지 않았으므로 그렇게 할 유틸리티가 없습니다). 나는 이것을했지만 로컬 SQL CE 파일에 대한 로컬 시스템에 폴더 구조를 만들려고했지만 여전히 그런 파일을 만들지는 않았습니다. 내 로컬 워크 스테이션을 제외하고 테스트 한 모든 시스템에서 IIS 사용자는 UnauthorizedAccessException을 생성 한 로컬 캐시 데이터베이스의 폴더 구조를 빌드 할 수있는 권한이 없었습니다.

오프라인 캐시를 데이터베이스로 연결하는 경우에도 클라이언트 멤버 자격 공급자는 여전히 오프라인 캐시를 사용하도록 설정해야합니다. 결코 생성하지 않는 로컬 캐시 파일.

0

web.config 파일에 system.diagnostic 태그를 추가하면 작동합니다. 는 (여기 또한 단지 빈 파일이 아닌 오류 메시지가 표시됩니다.)

<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

아주 좋음 - 시도해 보겠습니다. 고맙습니다. –

+0

이 web.config 노드를 인증 서버 앱과 테스트 앱에 모두 추가했습니다. 또한 이벤트 로그를 켰습니다. 이벤트 로그에 메시지가 나타나지 않으며 C : \ temp에 파일이 생성되지 않습니다. –

관련 문제