6

sorun Membership.GetUser ben GUID kullanırsanız gayet iyi çalışıyor, ama parametreler olmadan veya adla çalışırsanız başarısız: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); 

Diğer Gizemler

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

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

Kur

  • MVC
  • .NET 4.0
  • Standart SQL üyelik sağlayıcısı (hiçbir özel ya da geçersiz kılar)

örn:

<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> 
  • Standart aspnet_ * hiçbir özelleştirme ile veritabanı tabloları veya fazla anahtarlar
  • aspnet_Membership_GetAllUsers r DB'den el ile düzgün değil. Yönlendirilen çıktı beklenen sonuçlar
  • aspnet_Membership_GetUserByName Detayları DB

Exception kaynağından sıra çalışıyor iade ediliyor gösterir

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) 

Düşünceler

Yanlış bir şey var neredeyse gibi Membership.GetUser yönteminin içinde. Benim System.Web.dll (sürüm 4.0) için System.Web.Security.SqlMembershipProvider.GetUser için kod dışarı yansıyan ve aşağıdaki alıyorum:

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

Sonraki Adım Ben

Bundan sonra gitmem gereken yerdeki SO kalabalıktan bir yön bulmayı umuyorum. Ya bu yöntemi geçersiz kılabileceğimi ve sadece kendi hata ayıklamak için kendi sağlayıcımı bir araya getirebileceğimi ya da sadece daralan şeyi dolaşabileceğimi ve doğrudan DB'ye seslenebileceğimi düşünüyorum. Bu bazı temel DB CRUD'larından çok fazla kalp ağrısı gibi görünüyor.

  • 3/5/2013

    Mevcut Durum: Benim aspnet_Users tablo yerine uniqueidentifier bir nvarchar(256) olarak UserId sahip bu sabah keşfetti. Belki de SqlDataReader.GetGuid() orada boğuluyor. Bu akşam sorun olup olmadığını görmek için bazı testler yapacağım. Tablo yapmamın eski olup olmadığını merak ediyorum, çünkü çevrimiçi belgeler bu alanı uniqueidentifier olarak gösteriyor.

+0

Bu nasıl başarısız? İstisna Detayları lütfen. –

+0

İstisna ayrıntıları eklendi. Satır: System.Data.SqlClient.SqlDataReader.GetGuid (Int32 i) emin tuhaf görünüyor. – maulkye

+0

Ayrıca, "yansıtacak"/ters-mühendislik/kod çözme için kod için gidecekseniz, statik Üyelik sınıfında GetUser() yöntemine bakmanız gerekir - Membership.GetUser() - it Mevcut kullanıcının kimliği ile ilgili varsayımların yapıldığı yer. GetUser(), bir web uygulaması –

cevap

1

Cevap

Benim aspnet_User ve aspnet_Membership tabloları nvarchar(256) bir türüne UserId set vardı kullanabilirsiniz.

Tartışma Bu SqlMembershipProvider.GetUser yönteminden aşağıdaki satırı sırasında hataya neden gibi görünüyor

: Ben NET çerçeveler 2 ve 4 hem Aspnet_regsql.exe ran

Guid guid = reader.GetGuid(8); 

ve her ikisi de UserId'yi benzersiz bir tanımlayıcıya ayarladı ve bana (hiç de olsa) standart bir ASPNET DB'ye sahip olmadığımı düşünmeme yol açtı.

projenin geçmişinde küçük bir kazma bu üyelik veritabanı başlangıçta MySql için özel sağlayıcısına yoluyla oluşturulan ortaya koymaktadır. Sadece varsayılan sağlayıcıya geçtiğimizde asla yenilenmediği sonucuna varabilirim.

Geri bildirimleri için herkese teşekkürler.

1

Neden membership.CurrentUserName() kullanıyorsunuz?Sadece HttpContext.Current.User.Identity.Name;