8 Stimmen

ASP.NET MVC-Authentifizierungs-Cookie wird nicht abgerufen

Ich habe eine harte Zeit Implementierung "Remember Me" Funktionalität in einer MVC-Anwendung mit einem benutzerdefinierten Prinzipal. Ich habe das Problem darauf zurückgeführt, dass ASP.NET das Authentifizierungs-Cookie nicht abruft. Ich habe unten einen Schnappschuss von Google Chrome eingefügt.

  1. Zeigt die Ergebnisse von Request.Cookies, die in der Controller-Aktion gesetzt und in ViewData platziert werden, damit der View sie lesen kann. Beachten Sie, dass das .ASPXAUTH-Cookie fehlt

  2. Zeigt die Ergebnisse aus den Chrome-Entwicklertools an. Sie können sehen, dass .ASPXAUTH hier enthalten ist.

alt text

Woran kann das liegen? Warum liest ASP.NET diesen Wert nicht aus der Cookie-Sammlung?

Meine Anwendung verwendet ein benutzerdefiniertes IPrincipal. BusinessPrincipalBase ist ein CSLA-Objekt, das nur IPrincipal implementiert. Hier ist der Code dafür:

[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;
    }

Die Anwendung verwendet auch einen benutzerdefinierten Mitgliedschaftsanbieter. Hier ist der Code dafür.

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
}

Ich glaube nicht, dass irgendetwas davon damit zusammenhängt, denn im Endeffekt gibt die Request.Cookies das Authentifizierungs-Cookie nicht zurück. Hängt es mit der Größe des Cookies zusammen? Ich habe gehört, es gibt Probleme mit der Größe des Cookies.

UPDATE: Es scheint, dass sich das Problem um Subdomains dreht. Diese Website wurde mit einer Subdomain gehostet und die Cookie-Domain wurde leer gelassen. Hat jemand einen Tipp, wie ich das Auth-Cookie für alle Domains zum Laufen bringen kann (z. B. http://example.com , http://www.example.com y http://sub.example.com )?

1voto

sestocker Punkte 3504

Wenn Sie versuchen, das eigentliche Benutzerobjekt im Cookie selbst zu speichern, ist es wahrscheinlich zu groß, um als Cookie gespeichert zu werden. Ich bin nicht zu vertraut mit der MVC-Authentifizierung Zeug, aber in Web-Formulare, die ich in der Regel tun die folgenden:

FormsAuthentication.RedirectFromLoginPage(user_unique_id_here, false);

Der zweite Parameter ist für die gesuchte Beständigkeit.

Von dort aus erstelle ich einen benutzerdefinierten Kontext (UserContext), den ich über das HttpModule befülle, das mir Zugriff auf alle Benutzer- und Rolleninformationen gibt.

Da ich nicht in MVC (noch) oder CSLA entwickeln, bin ich nicht sicher, wie viel mehr Hilfe ich sein kann. Wenn ich Sie wäre, würde ich auch die benutzerdefinierte Mitgliedschaft Anbieter wegwerfen. Sie könnten genauso gut einfach MoralePrincipal.Login direkt in Ihrem Authentication Controller aufrufen.

1voto

Paul Punkte 34419

Das rememberMe-Zeug sollte durch den FormsAuthenticationService (in MVC2) oder die statische Klasse FormsAuthentication in MVC1 festgelegt werden, wenn Sie den Code des "normalen" AccountControllers verwenden. Wenn Sie diesen Code geändert haben, haben Sie daran gedacht, den (optionalen) booleschen Parameter hinzuzufügen, der angibt, ob ein dauerhaftes Cookie verwendet werden soll oder nicht?

Für mich hört sich das so an, als ob Sie einen Sitzungscookie erhalten, aber keinen dauerhaften Cookie.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X