2012-12-15 32 views
9

Budowanie strony internetowej, która również będzie wymagać interfejsu API, a co za tym idzie (prawdopodobnie) obsługa protokołu OAuth dla logowania Mam wątpliwości, w jaki sposób podejść do użytkownika i części uwierzytelniającej.Uwierzytelnianie za pomocą Asp.Net, RavenDB i OAuth

Mam więc aplikację ASP.NET MC4 z RavenDB.

Jakie jest najlepsze podejście?

  • Aby użyć jednego z dostawców członkostwa dla RavenDB i osobno poradzić sobie z Oauth w części API? Przykł. Rozwiązanie Griffina here.

  • Albo stworzyć niestandardowe rozwiązanie, które ponownie wciela w swoje członkostwo bzdury i obsługuje OAuth.

Nie jestem pewien, od czego zacząć, wszelkie sugestie, jak to zrobić są mile widziane.

Odpowiedz

10

enter image description here

** Clicky-click for da GitHub project **

IMO, zapomnieć przechowywanie nazw użytkownika i haseł. To szalona rozmowa! Pozwól użytkownikom logować się za pomocą swoich danych z Facebooka, Google lub Twittera. To 80% za wspólne strony internetowe.

Uwierzytelnienie i przechowywanie danych uwierzytelniających to dwa różne zadania IMO. Na przykład, nie obchodzi mnie, gdzie uwierzytelniasz się przeciwko .. i kiedy to robisz .. Nie obchodzi mnie, jak przechowujesz te dane :)

Osobiście chciałbym przechowywać go w RavenDb .. ale to jest moje osobisty wybór.

Jako takie -> zachowanie tych dwóch zadań SEPARATE jest (IMO) kluczowe.

enter image description here

Więc lets look at some codez ....

public ActionResult AuthenticateCallback(string providerKey) 
{ 
    // SNIP SNIP SNIP SNIP 

    var model = new AuthenticateCallbackViewModel(); 
    try 
    { 
     // SNIP SNIP SNIP SNIP 

     // Complete the authentication process by retrieving the UserInformation from the provider. 
     model.AuthenticatedClient = _authenticationService.CheckCallback(providerKey, Request.Params, state.ToString()); 


     // Create a new user account or update an existing account. 
     // Whatever you end up doing, this is the part u want to 
     // pass this data to your repository (eg. RavenDb, Sql Server, etc) 
     // I'll use RavenDb in this example... 
     // And yes .. this is a contrite example. U might want to check for 
     // existing email or id or whatever u need to do, etc. 
     var myUser = Mapper.Map(model.AuthenticatedClient); 
     session.Store(myUser); 
     session.SaveChanges(); 

     // SNIP SNIP SNIP SNIP 
    } 
    catch (Exception exception) 
    { 
     model.Exception = exception; 
    } 

    return View(model); 
} 

Więc spójrzmy na to, co zrobiłem.Wyciągnąłem wszelkie gadatliwe rzeczy (sprawdzanie wartości, itp.), Które są po prostu szumem w odpowiedzi na to pytanie.

Po pierwsze, obsługuję wywołanie zwrotne Authenticate. Na przykład. Właśnie wyjechałem na Facebooka i mówi się "tak! TY JESTEŚ ... i wraca do mojej witryny z pewnymi danymi, o które prosiłem.

Dalej ... otrzymujemy dane z Facebooka .. ale może nie być to format, który chcemy umieścić w RavenDb. Więc konwertuję ze starego formatu na nową, połyskującą klasę User, którą włożysz do swojego Db.

Po trzecie - przechowuję to w Db. Tutaj można zrobić dowolną niestandardową logikę DB

to wszystko.

M O D U L a R i Z E t H a H I S T T

The.End.

Przepraszam .. zostało jeszcze kilka godzin przed Apokalipsą. Muszę się przygotować.

+0

Zrobiłem dokładnie to. Moją potrzebą jest zidentyfikowanie użytkownika, a nie uwierzytelnianie - mogą to zrobić wbrew temu, co jest. To działa. Teraz, gdy zapisałem użytkownika w moim DB, muszę go użyć razem z systemem członkowskim ASP.NET. Więc mogę oznaczać akcje za pomocą [Authorize] i [AllowAnonymous], zwracaj adres URL itp wbudowanych funkcji w ASP.NET. Jak mogę to zrobić? Z tym: http://www.codethinked.com/setting-up-authentication-in-aspnet-mvc – esbenr

+2

@esbenr Aby użyć atrybutów '[Authorize]', etc .. ty ** NIE ** (i ja powtórz, ** NIE **) musi używać systemu członkostwa ASP.NET. ** PROSIMY NIE KORZYSTAĆ, ŻE W ZAKRESIE JAKICHKOLWIEK OKOLICZNOŚCI ** (Google z 1000000 powodów). Aby wykorzystać "[Authorize]", itp. Po prostu trzeba użyć informacji o używaniu przechowywać w 'IPrincipal' i' IIdentity' (tak, 2x I's). Po prostu utwórz nowy "GenericPrincipal", a następnie dodaj nowy "GenericIdentity". Google dla tych, którzy mają więcej kodu :) –

+0

Dzięki, to właśnie skończyłem. Użyłem tylko biletu Auth + cookie, aby uruchomić statyczną funkcję użytkownika USER - działa jak urok :-) Ta metoda podaje wiele miejsc w Internecie. BTW: Stworzyłem niestandardową implementację IPYNciple i niestandardową implementację IIdentity. w związku z tym chciałem więcej właściwości w moim kontekście użytkownika. Dzięki za odpowiedź./esbenr – esbenr

0

Dobrze. Dostawcy członkostwa są nadęci. Jeśli nie planujesz używać tych funkcji, ale tylko OAuth, nie użyłbym ich. Firma SimpleMembership i dostawca przysięgi dostarczone w MVC4 są niestety jeszcze większym bałaganem.

więc opcje są:

  1. Użyj SimpleMembership
  2. Wbudowany OAuth wsparcie
  3. Korzystanie dostawcę członkostwa niestandardowych
  4. Zastosowanie dostawcą zwyczaj oauth

Jeśli plan trzymać się # 3 Polecam używać mojego (w Griffin.MvcContrib). Budowanie dostawcy członkostwa nie jest banalne.

Jak dla OAuth masz rozwiązanie jak: https://github.com/rafek/SimpleSocialAuth

Powiązane problemy