6

문제 Membership.GetUser 내가 GUID를 사용하는 경우 잘 작동하지만 내가 매개 변수없이 또는 이름으로하려고하면 실패SqlMembershipProvider Membership.GetUser

//This works and adds records to aspnet_user & aspnet_Membership tables 
MembershipUser membershipUser = Membership.CreateUser(_name, _pwd, _email, null, null, true, null, out createStatus); 

//These fail with an InvalidCastException 
MembershipUser membershipUser2 = Membership.GetUser(_name, true); 
MembershipUser membershipUser3 = Membership.GetUser(); 

//If I go look up the GUID for this user (userId), this works! 
MembershipUser membershipUser4 = Membership.GetUser(new Guid("E1428CD3-CF17-494E-AB77-CF8F6010F585"), true); 

다른 신비

//This works 
Int32 count = Membership.GetNumberOfUsersOnline();  

//this fails (but totalRecords has the right value) 
Int32 totalRecords; 
MembershipUserCollection col = Membership.GetAllUsers(0,100, out totalRecords); 

설치

012 3,516,
  • MVC
  • .NET 4.0
  • 기본 SQL 멤버 자격 공급자 (어떤 사용자 정의 또는 재정의)

예 :

<membership defaultProvider="SqlProvider"> 
    <providers> 
     <clear /> 
     <add name="SqlProvider" 
      type="System.Web.Security.SqlMembershipProvider" 
      connectionStringName="MyDB" 
      enablePasswordRetrieval="false" 
      enablePasswordReset="true" 
      requiresQuestionAndAnswer="false" 
      applicationName="myapp" 
      requiresUniqueEmail="false" 
      passwordFormat="Hashed" 
      maxInvalidPasswordAttempts="5" 
      minRequiredPasswordLength="2" 
      minRequiredNonalphanumericCharacters="0" 
      passwordAttemptWindow="10" 
      passwordStrengthRegularExpression="" /> 
    </providers> 
</membership> 
  • 표준 aspnet_ *없는 정의와 데이터베이스 테이블 또는 추가 키
  • aspnet_Membership_GetAllUsers r DB로부터 수작업으로 괜찮아요. 리디렉션 출력은 예상 된 결과는
  • aspnet_Membership_GetUserByName에 대한 자세한 사항 DB를

Exception에서뿐만 아니라 작동하고 반환되는 보여줍니다

Specified cast is not valid. 
    at System.Data.SqlClient.SqlBuffer.get_SqlGuid() 
    at System.Data.SqlClient.SqlDataReader.GetGuid(Int32 i) 
    at System.Web.Security.SqlMembershipProvider.GetUser(String username, Boolean userIsOnline) 
    at System.Web.Security.Membership.GetUser(String username, Boolean userIsOnline) 

생각

그것은 뭔가 잘못 거기에 거의 같다 Membership.GetUser 메서드 내에 있습니다. 내를 System.Web.dll (버전 4.0)에 대한 System.Web.Security.SqlMembershipProvider.GetUser의 코드를 반영하고 난 다음 얻을 :

public override MembershipUser GetUser(string username, bool userIsOnline) 
{ 
    SecUtility.CheckParameter(ref username, true, false, true, 256, "username"); 
    SqlDataReader reader = (SqlDataReader) null; 
    try 
    { 
    SqlConnectionHolder connectionHolder = (SqlConnectionHolder) null; 
    try 
    { 
     connectionHolder = SqlConnectionHelper.GetConnection(this._sqlConnectionString, true); 
     this.CheckSchemaVersion(connectionHolder.Connection); 
     SqlCommand sqlCommand = new SqlCommand("dbo.aspnet_Membership_GetUserByName", connectionHolder.Connection); 
     sqlCommand.CommandTimeout = this.CommandTimeout; 
     sqlCommand.CommandType = CommandType.StoredProcedure; 
     sqlCommand.Parameters.Add(this.CreateInputParam("@ApplicationName", SqlDbType.NVarChar, (object) this.ApplicationName)); 
     sqlCommand.Parameters.Add(this.CreateInputParam("@UserName", SqlDbType.NVarChar, (object) username)); 
     sqlCommand.Parameters.Add(this.CreateInputParam("@UpdateLastActivity", SqlDbType.Bit, (object) (bool) (userIsOnline ? 1 : 0))); 
     sqlCommand.Parameters.Add(this.CreateInputParam("@CurrentTimeUtc", SqlDbType.DateTime, (object) DateTime.UtcNow)); 
     SqlParameter sqlParameter = new SqlParameter("@ReturnValue", SqlDbType.Int); 
     sqlParameter.Direction = ParameterDirection.ReturnValue; 
     sqlCommand.Parameters.Add(sqlParameter); 
     reader = sqlCommand.ExecuteReader(); 
     if (!reader.Read()) 
     return (MembershipUser) null; 
     string nullableString1 = this.GetNullableString(reader, 0); 
     string nullableString2 = this.GetNullableString(reader, 1); 
     string nullableString3 = this.GetNullableString(reader, 2); 
     bool boolean1 = reader.GetBoolean(3); 
     DateTime creationDate = reader.GetDateTime(4).ToLocalTime(); 
     DateTime lastLoginDate = reader.GetDateTime(5).ToLocalTime(); 
     DateTime lastActivityDate = reader.GetDateTime(6).ToLocalTime(); 
     DateTime lastPasswordChangedDate = reader.GetDateTime(7).ToLocalTime(); 
     Guid guid = reader.GetGuid(8); 
     bool boolean2 = reader.GetBoolean(9); 
     DateTime lastLockoutDate = reader.GetDateTime(10).ToLocalTime(); 
     return new MembershipUser(this.Name, username, (object) guid, nullableString1, nullableString2, nullableString3, boolean1, boolean2, creationDate, lastLoginDate, lastActivityDate, lastPasswordChangedDate, lastLockoutDate); 
    } 
    finally 
    { 
     if (reader != null) 
     reader.Close(); 
     if (connectionHolder != null) 
     connectionHolder.Close(); 
    } 
    } 
    catch 
    { 
    throw; 
    } 
} 

다음 단계 나 '

내가 어디로 가야하는지에 대한 SO 군중으로부터 어떤 방향을 얻기를 바란다. 나는이 메소드를 오버라이드 (override) 해, 디버그하기 위해서 (안)에서 독자적으로 프로 바이더를 조합 할 수가있는 것, 또는, 그저 DB에 직접 호출 할 수있는 것이라고 생각합니다. 이것은 몇 가지 기본적인 DB CRUD의 많은 상흔처럼 보입니다.

  • 2013년 3월 5일

    현재 상태 : 내 aspnet_Users 테이블 대신 uniqueidentifiernvarchar(256)UserId을 가지고 아침을 발견했다. 아마도 SqlDataReader.GetGuid()이 거기에서 질식하고있을 것입니다. 오늘 저녁에 문제가 있는지 시험해 볼게. 온라인 문서가이 필드를 uniqueidentifier으로 표시하기 때문에 내 테이블 구조가 구식인지 궁금합니다.

+0

어떻게 실패합니까? 예외 사항을 알려주십시오. –

+0

예외 세부 정보가 추가되었습니다. 줄 : System.Data.SqlClient.SqlDataReader.GetGuid (Int32 i)가 이상하게 보입니다. – maulkye

+0

또한 코드를 "리플렉션 아웃"/ 리버스 엔지니어링/디 컴파일 - 통찰력을 위해 사용할 경우 정적 멤버십 클래스 인 Membership.GetUser() - it에서 GetUser() 메서드를 살펴보아야합니다. 현재 사용자의 신원에 대한 가정이있는 곳입니다. GetUser()는 웹 응용 프로그램에서 CURRENT USER에 대한 세부 정보를 가져 오는 것으로 가정합니다. –

답변

1

대답

내 aspnet_User 및 aspnet_Membership 테이블 nvarchar(256)의 유형에 UserId 세트를 가지고 사용할 수 있습니다.

토론이는 SqlMembershipProvider.GetUser 방법에서 다음 줄 중 오류의 원인이 된 것으로 나타납니다

: 나는 .NET 프레임 워크 2와 4에서 모두 aspnet_regsql.exe 실행

Guid guid = reader.GetGuid(8); 

, 그리고 둘 다 UserId를 uniqueidentifier로 설정하여 내가 (결국) 표준 ASPNET DB를 가지고 있지 않다고 생각하게했다.

프로젝트의 역사에서 약간의 발굴이 회원 데이터베이스가 원래 MySQL을에 대한 사용자 지정 공급자를 통해 생성 된 것을 알 수있다. 나는 기본 공급자로 다시 전환했을 때 결코 재생성되지 않는다고 결론 지을 수 있습니다.

의견에 감사드립니다.

1

membership.CurrentUserName()을 사용합니까?당신은 HttpContext.Current.User.Identity.Name;

관련 문제