2010-09-11 14 views
8

Tworzę nową witrynę i chcę, aby użytkownicy mogli korzystać z kilku sposobów logowania, w zasadzie użytkownicy powinni być w stanie aby utworzyć nowego użytkownika w mojej witrynie LUB użyć połączenia Facebook LUB Użyj konta Twittera do zalogowania się na stronie.Użyj mieszanego uwierzytelniania z Asp.Net MVC (Formularze, FB connect, twitter, openId)

Widziałem kilka tutoriali na temat korzystania z jednej z tych metod, co chcę wiedzieć, co według Ciebie jest najlepszym podejściem do tego?

Do tej pory uważam, że najlepiej byłoby stworzyć niestandardowy model uwierzytelniania (coś w stylu podtypy istniejących klas autoryzacji).

Czy to najlepsze podejście? Czy możesz wskazać mi na dobry przykład kogoś, kto próbuje czegoś podobnego?

Thanks a lot

Odpowiedz

8

I blogu o coś podobnego niedawno ... Oto podejście Wziąłem

public class User { 
    public int UserID { get; set; } 
    public string Name { get; set; } 
    public string Page { get; set; } 

    public virtual Authentication Authentication { get; set; } 
} 

public class Authentication { 
    public int Id { get; set; } 
    public string LoginId { get; set; } 
    public string Provider { get; set; } 
    public string Password { get; set; } 

    public virtual User User { get; set; } 
} 

//login methods 
User StandardUserLogin(string username) { 
    IDataContext db = new DataContext(); 
    var user = db.Users.SingleOrDefault(u => u.Authentication.LoginId == username); 
    if (user != null) { 
     if (user.Authentication.Password == password) { 
      SetAuthenticationTicket(user); 
      return user; 
     } 
    } 
} 

Chciałbym utworzyć inną metodę logowania dla każdego typu logowania w zależności od sposobu ich systemów zezwoleń praca.

User OpenIdUserLogin(string username) { 
    IDataContext db = new DataContext(); 
    var user = db.Users.SingleOrDefault(u => u.Authentication.LoginId == username && u.Authentication.Provider == "openid"); 
    if (user == null) { 
     //create new openid user 
    } 

    if (user.Authentication.LoginId == id) { 
     SetAuthenticationTicket(user); 
     return user; 
     } 
} 

//openid's authentication method 
[ValidateInput(false)] 
public ActionResult Authenticate(string returnUrl) { 
    IAuthenticationResponse response = OpenId.GetResponse(); 

    if (response == null) { 
     //make openid request here 
    } else { 
     var user = OpenIdUserLogin(response.ClaimedIdentifier); 
    } 
} 

Btw, dwie klasy na szczycie reprezentować mój Entity Framework Poços Kluczem tutaj jest tabela uwierzytelniania, który jest oddzielony od stołu użytkownika. Pozwala on jednemu użytkownikowi na korzystanie z wielu metod logowania. Mamy nadzieję, że pomoże Ci to osiągnąć zamierzony cel.

+0

Szybkie pytanie; Te metody są przeznaczone dla OpenID, a nie Open Authentication, którego używa Twitter. Czy możemy wykonać tę samą procedurę, niezależnie od tego, czy jest to OpenID czy Open Auth? – FelixMM

+0

Tak, to klasy POCO są dość ogólne. Być może będziesz musiał dodać pole lub dwa, ale wątpię, że biorąc pod uwagę moje ograniczone doświadczenie z twittem, musisz tylko przechowywać swój token autoryzacji, który będzie przechowywany w polu 'LoginId'. Następnie po prostu wywołasz inną metodę na różnych typach logowania. Więc zamiast OpenIdUserLogin zadzwoniłbyś na Twitter. Jeśli nie jestem zbyt zajęty, dodam nowy post na moim blogu, jeśli masz problemy :) – Buildstarted

+0

Dzięki za odpowiedź. Zaimplementowałem login OpenID w bardzo podobny sposób, jak tu odpowiedziałeś i teraz idę do oAuth. Obecnie śledzę te dwa linki: http://bit.ly/csBrgM i http://bit.ly/i8GwDh Nie testowałem jeszcze, więc może pójść naprawdę dobrze, lub naprawdę źle, ale znowu, dzięki za twoją odpowiedź :) – FelixMM

1

Jeśli jesteś otwarty na wydawanie kilku dolarów miesięcznie, Windows Azure Access Control Service zapewnia tę funkcję jako dostawca członkostwa dla ASP.NET. Jest to również podstawa nowego przepływu danych logowania Windows 8 SSO.

Pamiętaj, że Twitter nie jest jeszcze obsługiwany, ponieważ Kontrola dostępu nie obsługuje protokołu OAuth 1.0.

Powiązane problemy