2010-02-04 15 views
17

To pytanie jest trochę strukturalnym/projektowym pytaniem, ponieważ mam problem z wypracowaniem najlepszego sposobu wykonania tego zadania.Przechowywanie informacji DotNetOpenAuth i pobieranie informacji użytkownika

W mojej aplikacji MVC używam DotNetOpenAuth (3.4) jako mojego informatora login i tylko przy użyciu standardowego FormsAuthentication dla ciasteczek itp

Aktualna tabela użytkownika w DB:

  • Identyfikator użytkownika (PK, uniqueidentifier) ​​
  • OpenIdIdentifier (nvarchar (255))
  • OpenIdDisplay (nvarchar (255))
  • dISPLAYNAME (nvarchar (50)),
  • Email (nvarchar (50))
  • PhoneNumber (nvarchar (50))

Jak UserId jest jasne, identyfikator użytkownika (powinny one mieć możliwość zmiany dostawcy OpenID w późniejszym terminie), jest to klucz, do którego prowadzą inne tabele (dla użytkownika).

To jest bieżący kod, który po pomyślnym uwierzytelnieniu tworzy tymczasowego użytkownika i przekierowuje do Utwórz działanie.

 switch (response.Status) 
     { 
      case AuthenticationStatus.Authenticated: 

       FormsAuthentication.SetAuthCookie(response.ClaimedIdentifier, false); 

       var users = new UserRepository(); 
       if (!users.IsOpenIdAssociated(response.ClaimedIdentifier)) 
       { 
        var newUser = new DueDate.Models.User(); 
        newUser.OpenIdIdentifer = response.ClaimedIdentifier; 
        newUser.OpenIdDisplay = response.FriendlyIdentifierForDisplay; 

        TempData["newUser"] = newUser; 

        return this.RedirectToAction("Create"); 
       } 

A teraz do sedna pytania:

  1. Czy response.ClaimedIdentifier poprawna informacja do przechowywania przed użytkownikiem?

  2. Czy preferowanym sposobem uwierzytelniania formularzy jest FormAuthentication.SetAuthCookie? Czy jest jakiś lepszy sposób?

  3. Kiedy dzwonię do SetAuthCookie, nie ma danych dotyczących użytkownika z wyjątkiem ClaimedIdentifier. Jeśli konsekwentnie odwołuję się do ich UserId, lepiej jest utworzyć użytkownika, a następnie zapisać ten plik cookie w pliku cookie zamiast ?

  4. Jeśli używam tego identyfikatora użytkownika w wielu miejscach, w jaki sposób mogę go pobrać z pliku cookie lub zapisać w innym miejscu bardziej logicznym/użytecznym?

trochę długo zdyszany, ale ja już kłopoty stara się wypracować najlepszy sposób to zrobić/

Odpowiedz

26

1.Czy response.ClaimedIdentifier poprawną informację do przechowywania przeciwko użytkownikowi?

Tak. Upewnij się, że w kolumnie, w której jest przechowywany w bazie danych, rozróżniana jest wielkość liter. Oto schemat tabeli, który pokazuje, jak upewnić się, że rozróżniana jest wielkość liter. Wynika to ze schematu bazy danych szablonu DotNetOpenAuth. Bit "CS" określonego sortowania oznacza Case Sensitive.

CREATE TABLE [dbo].[AuthenticationToken] (
    [AuthenticationTokenId] INT   IDENTITY (1, 1) NOT NULL, 
    [UserId]     INT   NOT NULL, 
    [OpenIdClaimedIdentifier] NVARCHAR (250) COLLATE SQL_Latin1_General_CP1_CS_AS NOT NULL, 
    [OpenIdFriendlyIdentifier] NVARCHAR (250) NULL, 
    [CreatedOn]    DATETIME  NOT NULL, 
    [LastUsed]     DATETIME  NOT NULL, 
    [UsageCount]    INT   NOT NULL 
); 

2.Is FormAuthentication.SetAuthCookie preferowany sposób uwierzytelniania form? Czy jest jakiś lepszy sposób?

Dla aplikacji MVC zdecydowanie jest, ponieważ nadal można zwrócić preferowaną ActionResult z metody.

3.Gdy zadzwonię do SetAuthCookie, nie ma danych dotyczących użytkownika z wyjątkiem ClaimedIdentifier. Jeśli konsekwentnie odwołuję się do ich UserId, lepiej jest utworzyć użytkownika, a następnie zapisać ten UserId w pliku cookie zamiast ClaimedIdentifier?

To brzmi jak osobiste preferencje. Ale zwykle używam id_użytkownika, ponieważ może to spowodować szybsze wyszukiwanie bazy danych za każdym razem, gdy pojawi się żądanie HTTP, które wymaga wyszukania informacji o użytkowniku.

4.Jeśli używam tego identyfikatora użytkownika w wielu miejscach, w jaki sposób mogę go pobrać z pliku cookie lub zapisać w innym miejscu bardziej logicznym/użytecznym?

FormsAuthentication robi zapewnić sposób przechowywania informacji w zaszyfrowanym pliku cookie niż tylko nazwa użytkownika, ale jest to trudniejsze, niż można by oczekiwać, aby go używać. Ten fragment pochodzi z próbki internetowej OSM RP DotNetOpenAuth za:

const int TimeoutInMinutes = 100; // TODO: look up the right value from the web.config file 
var ticket = new FormsAuthenticationTicket(
    2, // magic number used by FormsAuth 
    response.ClaimedIdentifier, // username 
    DateTime.Now, 
    DateTime.Now.AddMinutes(TimeoutInMinutes), 
    false, // "remember me" 
    "your extra data goes here"); 

HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(ticket)); 
Response.SetCookie(cookie); 
Response.Redirect(Request.QueryString["ReturnUrl"] ?? FormsAuthentication.DefaultUrl); 

Następnie można uzyskać przy tym dodatkowych danych w przyszłości żądania HTTP z tym:

var cookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName]; 
if (cookie != null) { 
    var ticket = FormsAuthentication.Decrypt(cookie.Value); 
    if (!string.IsNullOrEmpty(ticket.UserData)) { 
     // do something cool with the extra data here 
    } 
} 
+0

Dziękuję bardzo, wielki odpowiedź i znacznie docenione :) –

Powiązane problemy