2011-01-01 9 views
1

Ich mache eine einfache ASP.NET-Webseite für meine Schulorganisation mit VS2010. Wenn ich "Neue Website" wähle, stelle ich fest, dass Visual Studio bereits eine Datenbank für die Verwaltung von Mitgliedschaften eingerichtet hat. Ich habe auch meine eigene Datenbank (MyDatabase), die ich für die Website verwenden muss, die Informationen über die Mitglieder der Organisation enthält (z. B. E-Mail, Telefonnummer usw.)Referenz ASP.NET-Mitgliedschaftsdatenbank in einer anderen Datenbank

Ich muss einen Weg haben um herauszufinden, wer der aktuell angemeldete Benutzer ist, und ihm erlauben, NUR seine Informationen (E-Mail, Telefonnummer) zu bearbeiten.

Die Art, wie ich es getan habe, ist:
- Fügen Sie ein Feld in MyDatabase namens "UserName" und verwenden Sie es als eine Art Fremdschlüssel aus der anderen Datenbank.
- Holen Sie den Benutzernamen des angemeldeten Benutzers
- zum Beispiel diesen Benutzernamen für meine Fragen verwenden:

// (PseudoCode)  
String loggedInUser = MembersDatbase.GetLoggedInUser();  
var MemberInfo = SELECT * FROM MyDatabase.Users WHERE UserName=loggedInUser; 

-Dann der angemeldete Benutzer nur Zugriff auf ihre Informationen haben.

Ich bin mir über den Code noch nicht sicher, aber ich könnte diesen Teil wahrscheinlich herausfinden. Ich bin mehr daran interessiert zu hören, ob es einen besseren Weg dafür gibt. Ich möchte die beiden Datenbanken NICHT zu einer einzigen Datenbank zusammenführen.

Danke.

Antwort

3

Anstatt die Standarddatenbank zu verwenden, die von Website Template erstellt wurde, würde ich vorschlagen, aspnet_regsql.exe zu verwenden, um die Mitgliedschaftstabelle in Ihrer vorhandenen MyDatabase zu installieren. Dann würde ich anstelle der Verknüpfung über den Benutzernamen die Tabelle mit dem Feld UserId der Tabelle aspnet_Users verknüpfen. Überprüfen Sie die folgenden Links:

1: Tutorial: Install membership table in existing database . Check the video here.

2: Link membership table to user info table

+0

das bricht die ganze Idee authenticatie/authorization steckbar zu haben, etwas, das sehr zentral in dem Membership-API ist –

+0

@ Tim Mahy: Ich habe keine Notwendigkeit sehen, zu verwenden, um zwei separate Datenbanken in das OP-Szenario. Ich bin mir nicht sicher, was genau du mit 'Pause' meintest. – gbs

+0

es ist eine Provider-konfigurierbare API, durch die Verwendung von Implementierungsdetails einer bestimmten Implementierung (SQLServer-Standardimplementierung) wird der gesamte vom Provider konfigurierbare Teil verworfen. –

1

würde ich diesen Ansatz verwenden, aber ich würde die ProviderUserKey und Providereigenschaftswerte für einen Benutzer in Ihrer Datenbank zur Karte verwenden ..

1

ich einen ähnlichen Ansatz in meiner Anwendung. Ich habe einen separaten DB für die Mitgliedschaft und wenn ich zusätzliche Daten über einen Benutzer speichere, erhalte ich einfach den ProviderUseKey und speichere ihn in einer separaten Tabelle, die zusätzliche Benutzerdaten enthält. Hier

ist der Beispielcode:

[AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Register(string userName, string email, string password, string confirmPassword) 
    { 
     ViewData["PasswordLength"] = MembershipService.MinPasswordLength; 

     if (ValidateRegistration(userName, email, password, confirmPassword)) 
     { 
      // Attempt to register the user 
      var createStatus = MembershipService.CreateUser(userName, password, email); 


      switch (createStatus) 
      { 
       case MembershipCreateStatus.Success: 
        FormsAuth.SignIn(userName, false /*createPersistentCookie */); 
        var userInfo = System.Web.Security.Membership.GetUser(userName); 
        if (userInfo != null) 
        { 
         if (userInfo.ProviderUserKey != null) 
         { 
          var regularUser = new RegularUser { UserName = userInfo.UserName, Email = userInfo.Email, ProviderUserKey = userInfo.ProviderUserKey.ToString() }; 
          _regularUserRepository.SaveOrUpdate(regularUser); 
         } 
        } 
        return RedirectToAction("Index", "Home"); 
       default: 
        ModelState.AddModelError("_FORM", ErrorCodeToString(createStatus)); 
        break; 
      } 
     } 

     // If we got this far, something failed, redisplay form 
     return View(); 
    } 

Hoffnung, das hilft.

Verwandte Themen