2010-06-07 17 views
8

Mam trudności z zaimplementowaniem funkcji "Zapamiętaj mnie" w aplikacji MVC z niestandardową wartością główną. Sprowadziłem to do ASP.NET, nie pobierając dla mnie pliku cookie uwierzytelniającego. Załączam snaphot poniżej z Google Chrome.Uwierzytelnianie plików cookie ASP.NET MVC nie jest pobierane (zaktualizowane)

  1. Pokazuje wyniki Request.Cookies który mieści się na terenie działania kontrolera i umieszczonych w ViewData w celu odczytania. Zauważ, że brakuje pliku cookie .ASPXAUTH.

  2. Wyświetla wyniki z narzędzi programistycznych Chrome. Widać, że .ASPXAUTH jest tutaj.

alt text http://i50.tinypic.com/ibctjd.png

Czy ktoś wie co może być tutaj problem? Dlaczego program ASP.NET nie odczytuje tej wartości z kolekcji plików cookie?

Moja aplikacja używa niestandardowego IPrincipala. BusinessPrincipalBase jest obiektem CSLA, który implementuje IPrincipal. Oto kod:

[Serializable()] 
public class MoralePrincipal : BusinessPrincipalBase 
{ 
    private User _user; 

    public User User 
    { 
     get 
     { 
      return _user; 
     } 
    } 

    private MoralePrincipal(IIdentity identity) : base(identity) 
    { 
     if (identity is User) 
     { 
      _user = (User)identity; 
     } 
    } 

    public override bool Equals(object obj) 
    { 
     MoralePrincipal principal = obj as MoralePrincipal; 
     if (principal != null) 
     { 
      if (principal.Identity is User && this.Identity is User) 
      { 
       return ((User)principal.Identity).Equals(((User)this.Identity)); 
      } 
     } 
     return base.Equals(obj); 
    } 

    public override int GetHashCode() 
    { 
     return base.GetHashCode(); 
    } 

    public static bool Login(string username, string password) 
    { 
     User identity = User.Fetch(username, password); 
     if (identity == null || !identity.IsAuthenticated) 
     { 
      identity = (User)User.UnauthenicatedIdentity; 
     } 

     MoralePrincipal principal = new MoralePrincipal(identity); 
     Csla.ApplicationContext.User = principal; 
     Context.Current.User = identity; 

     return identity != null && identity.IsAuthenticated; 
    } 

    public static void Logout() 
    { 
     IIdentity identity = User.UnauthenicatedIdentity; 
     MoralePrincipal principal = new MoralePrincipal(identity); 
     ApplicationContext.User = principal; 
     Context.Current.User = identity as User; 
    } 

    public override bool IsInRole(string role) 
    { 
     if (Context.Current.User == null || Context.Current.Project == null) 
     { 
      return false; 
     } 

     string userRole = Context.Current.User.GetRole(Context.Current.Project.Id); 
     return string.Compare(role, userRole, true) == 0; 
    } 

Aplikacja korzysta również z dostawcy członkostwa niestandardowego. Oto kod dla tego.

public class MoraleMembershipProvider : MembershipProvider 
{ 
    public override bool ValidateUser(string username, string password) 
    { 
     bool result = MoralePrincipal.Login(username, password); 
     HttpContext.Current.Session["CslaPrincipal"] = ApplicationContext.User; 
     return result; 
    } 

    #region Non-Implemented Properties/Methods 

    public override string ApplicationName 
    { 
     get 
     { 
      return "Morale"; 
     } 
     set 
     { 
      throw new NotImplementedException(); 
     } 
    } 

    // Everything else just throws a NotImplementedException 

    #endregion 
} 

Nie sądzę, że to wszystko jest powiązane, ponieważ najważniejsze jest to, że Request.Cookies nie zwraca pliku cookie uwierzytelniającego. Czy jest on powiązany z rozmiarem pliku cookie? Słyszałem, że są problemy z wielkością pliku cookie.

AKTUALIZACJA: Wydaje się, że problem dotyczy subdomen. Ta witryna była hostowana z subdomeną, a domena cookie pozostawiona była pusta. Czy ktoś ma jakieś wskazówki, w jaki sposób mogę uzyskać plik cookie uwierzytelniania do pracy ze wszystkimi domenami (na przykład http://mydomain.com, http://www.mydomain.com i http://sub.mydomain.com)?

+0

Czy możesz wpisać kod, którego używasz podczas logowania użytkownika? Czy używasz tylko wbudowanych funkcji FormsAuthentication, po prostu bez użycia dostawcy? Czy korzystasz z własnego, niestandardowego dostawcy? – sestocker

+0

Podczas pierwszego logowania, jakie wartości są powiązane z plikiem cookie (w szczególności z datą wygaśnięcia)? – sestocker

+0

Oto, jak wygląda ciasteczko: http://i50.tinypic.com/npm26c.png –

Odpowiedz

1

również to sprawdziłeś?

ASPXAUTH cookie is not being saved

Nie jestem pewien, czy to byłoby przyczyną cookie pokazując się w Chrome, ale w rzeczywistości nie są przekazywane do przeglądarki lub jeśli byłoby zapobiec cookie z oszczędności, ale również warte obejrzenia.

+0

Pracowałem nad zmniejszeniem rozmiaru i nadal nie mogę pobrać ciasteczka z kolekcji Request.Cookies, chyba że w tej samej sesji. Wiem, że to nie jest plik cookie sesji i jest on przechowywany na dysku. –

1

Jeśli próbujesz zapisać rzeczywisty obiekt użytkownika w samym pliku cookie, prawdopodobnie jest on zbyt duży, aby go zapisać jako plik cookie. Nie jestem zbyt zaznajomieni z uwierzytelniania rzeczy MVC, ale w formularzach internetowych Generalnie należy wykonać następujące czynności:

FormsAuthentication.RedirectFromLoginPage(user_unique_id_here, false); 

Drugim parametrem jest dla trwałości szukasz.

Stamtąd tworzę niestandardowy kontekst (UserContext), który zapełniam poprzez HttpModule, który daje mi dostęp do wszystkich informacji o użytkowniku i roli.

Ponieważ nie rozwijam się w MVC (jeszcze) ani w CSLA, nie jestem pewien, o ile więcej mogę pomóc. Gdybym był tobą, porzuciłbym również dostawcę niestandardowego członkostwa. Równie dobrze możesz po prostu zadzwonić do MoralePrincipal.Login bezpośrednio w kontrolerze Uwierzytelniania.

+0

Tak, to była moja myśl po tym, jak to pisałem. Myślę, że seryjna wersja mojego obiektu User jest zbyt duża. Być może będę musiał stworzyć inny obiekt dla IIdentity, który jest mniejszy i może być bezpiecznie serializowany na dysk. –

+0

http://stackoverflow.com/questions/2224562/asp-net-formsauthentication-redirect-loses-cookie-between-redirect-and-applic –

+0

Pracowałem przy użyciu mniejszego obiektu, który jest serializowany i nadal otrzymuję ten sam problem. Utknąłem raz jeszcze. –

1

Treść rememberMe należy ustawić za pomocą klasy statycznej FormsAuthenticationService (w MVC2) lub klasy statycznej FormsAuthentication w MVC1, jeśli używasz "zwykłego" kodu AccountController. Jeśli zmieniłeś ten kod, czy pamiętasz, aby dodać (opcjonalny) parametr boolowski wskazujący, czy użyć stałego pliku cookie, czy nie?

Wydaje mi się, że otrzymujesz plik cookie sesji, ale nie trwały plik cookie.

+0

Plik cookie znajduje się w ciasteczkach przeglądarki. Zweryfikowałem to za pomocą Firebug w Firefoksie i Developers Tools w Chrome. Problem polega na tym, że .NET po prostu nie zwraca pliku cookie w kolekcji. To nie jest plik cookie sesji. –

Powiązane problemy