문제 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
테이블 대신uniqueidentifier
의nvarchar(256)
로UserId
을 가지고 아침을 발견했다. 아마도SqlDataReader.GetGuid()
이 거기에서 질식하고있을 것입니다. 오늘 저녁에 문제가 있는지 시험해 볼게. 온라인 문서가이 필드를uniqueidentifier
으로 표시하기 때문에 내 테이블 구조가 구식인지 궁금합니다.
어떻게 실패합니까? 예외 사항을 알려주십시오. –
예외 세부 정보가 추가되었습니다. 줄 : System.Data.SqlClient.SqlDataReader.GetGuid (Int32 i)가 이상하게 보입니다. – maulkye
또한 코드를 "리플렉션 아웃"/ 리버스 엔지니어링/디 컴파일 - 통찰력을 위해 사용할 경우 정적 멤버십 클래스 인 Membership.GetUser() - it에서 GetUser() 메서드를 살펴보아야합니다. 현재 사용자의 신원에 대한 가정이있는 곳입니다. GetUser()는 웹 응용 프로그램에서 CURRENT USER에 대한 세부 정보를 가져 오는 것으로 가정합니다. –