asp.net MVC, wie registrierte Benutzer umleiten, die nicht über ein Profil zu Seite?

StackOverflow https://stackoverflow.com/questions/1079703

  •  21-08-2019
  •  | 
  •  

Frage

Wir bauen eine Website mit asp.net Mvc. Wir wollen, dass die Benutzer auf einfache Weise registrieren und ein Konto zu erstellen. Es ist aber ein ganz besonderes Stück von Informationen, die in seinem Profil eingetragen werden, dass wir ihn zeigen wollen * nach Anmeldung abgeschlossen ist, und er wird zum ersten Mal anmelden.

Die Logik ist, unabhängig von der URL, die getroffen wurde, wenn der Benutzer authentifiziert ist und nicht über ein gültiges Profil, leitet ihn an der „Profil erstellen“ Seite.

Die ganze ui wird auf diese Profil Entscheidungen abhängen. Welcher Ansatz sollten wir in dem MVC-Framework verwenden, zu zwingen, diesen Workflow auf dem Besucher? Die Ideen, die ich mit oben kommen kann erfordern Tonnen Code-Duplizierung in Steuerungen usw., so dass ich eindeutig eine schlechte Idee.

Wir verwenden Mitgliedschaft für die Nutzer, aber Profil ist unsere eigene Implementierung (kein Profil-Provider), die Profildaten zu einem userId verbinden wird.

War es hilfreich?

Lösung

Ich denke, der einfachste Weg, dies zu tun, entweder zu erstellen, ist eine benutzerdefinierte AuthorizeAttribute, Verlängerung des bestehenden oder eine separate FilterAttribute erstellen. Entweder eine davon bekommen würde, um alle Ihre Controller angelegt und dafür sorgen, dass ein authentifizierter Benutzer ein Profil aufweist. In dem Fall, in dem kein Profil vorhanden ist, würden die Filter die Benutzer auf die Seite umgeleitet, wo das Profil erstellt wird. Dies würde durch Setzen der Eigenschaft result auf dem Kontext zu einem RedirectResult zur Profilerstellung Aktion durchgeführt werden. Nur wenn das Profil existiert und vollständig würde der Benutzer den Filter ermöglichen, die gewünschte Aktion, um fortzufahren.

Alternativ könnten Sie einen Basis-Controller erstellen, den OnActionExecuting außer Kraft gesetzt und führt die gleiche Aufgabe. Ich ziehe das Attribut Mechanismus wie es flexibler ist, das heißt, könnten Sie einige öffentliche Aktionen, die ohne das Profil nicht zugänglich sind (einschließlich der Profileinstellung Aktion).

Andere Tipps

Die Beantwortung meiner Frage: Am Ende habe ich eine benutzerdefinierte Action. Am Anfang nahm ich den Weg der Subklassifizieren [autorisieren] in [AuthorizeCheckProfile]. Aber dann erkannte ich, dass der Anwendungsfall war falsch: ich nicht die angemeldete in nur Teile meiner Website zum Erstellen-Profilseite umleiten wollte, wenn kein Benutzerprofil vorhanden. Ich wollte jede Seite von meiner Seite auf dieser Seite umgeleitet werden, wenn sie ein ohne Profil-angemeldeten Benutzer. Der einzige Ort, ich mag nicht, dass prüfen ist, in dem Ist-Profil erstellen. Hier ist der Code:

public class AssertProfileAttribute : ActionFilterAttribute {
    public AssertProfileAttribute() {
    }

    public override void OnActionExecuting(ActionExecutingContext filterContext) {
        if (filterContext.HttpContext.Request.IsAuthenticated == false)
            return;
        //we have a user, but does he have a profile?
        if (filterContext.HttpContext.Session["UserProfile"] == null) { //not in the session
            IUnityContainer container = filterContext.HttpContext.Application["container"] as IUnityContainer;
            Profile hasProfile = container.Resolve<IProfileRepository>().GetUserProfile(Membership.GetUser());
            if (hasProfile == null) {
                //we have to redirect to the create profile 
                string returnURL = filterContext.HttpContext.Request.AppRelativeCurrentExecutionFilePath;
                filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = "Profile", action = "Create", returnTo = returnURL }));
            } else {
                //he has a profile but we haven't put it in session yet
                filterContext.HttpContext.Session["UserProfile"] = hasProfile;
            }
        }
    }
}

Es hat den Nebeneffekt, dass sie das Profil in einem Sitzungsschlüssel gespeichert werden. Auf diese Weise kann es leicht abgerufen werden, so dass weitere Kontrollen Rolle in jeder Anforderung mit anderen benutzerdefinierten Filtern passieren können. Die Implementierung verwendet Unity und Repositories für DB-Zugriff.

Vielen Dank an die Gemeinde.

Versuchen Aktion Filter und Filter Attribut betrachten, wenn nicht sogar die meisten Seiten so tun müssen, oder aber, Sie tatsächlich diese Umleitung Logik setzen kann Global.asax (in denen Begin Anfrage oder ähnliche Ereignisse)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top