Ich habe ein Problem, das mich schon seit geraumer Zeit beschäftigt (ich habe es für eine Weile ruhen lassen, aber jetzt, wo ich zurück bin, finde ich immer noch keine Lösung).
Die Einstellung ist wie folgt: Ich verwende nicht die Standardanbieter für Mitgliedschaft, Rollen oder Profile. Vielmehr verwendet meine Anwendung nur OpenID-Login, sie implementiert keine Passwörter. Außerdem verwendet meine Benutzertabelle die ID als Primärschlüssel anstelle des Benutzernamens.
Was die Authentifizierung angeht, so ist die Forms-Authentifizierung großartig, aber für einige Aktionen muss ich die ID des aktuell angemeldeten Benutzers kennen. Dies stellt ein Problem dar, da die Forms-Authentifizierung nur den Namen in der Eigenschaft "User" festlegt (zugänglich innerhalb der Eigenschaft "User" des Controllers, insbesondere in "User.Identity.Name").
Ich würde idealerweise wie etwas wie User.Identity.ID, so dass es innerhalb des Cookies enthalten sein könnte (wenn ich nicht falsch bin), da dies der Primärschlüssel meiner Benutzertabelle ist.
Was ich in der Login-Methode meines AccountControllers verwendet habe, war das folgende hässliche und unordentliche Ding
user = _userRepository.GetByOpenId(identifier);
FormsAuthenticationTicket ticket =
new FormsAuthenticationTicket(1, user.DisplayName,
DateTime.Now,
DateTime.Now.AddDays(10),
false /*rememberMe*/,
user.UserID.ToString());
Und später, als ich die Benutzer-ID abrufen musste:
int loggedUserID = Convert.ToInt32(((FormsIdentity)User.Identity).Ticket.UserData);
Ich im Grunde verschlüsselt die ID in der Forms-Cookie, aber abgesehen davon, dass ich mich schmutzig fühlen, sehe ich nicht, wie diese Einheit zu testen (wie man einen gefälschten Benutzer liefern, wo benötigt, einschließlich andere Controller).
Zusammengefasst habe ich hier also zwei Probleme:
- Wie kann man dies einfacher und weniger umständlich gestalten (z. B. indem man etwas als User.Identity.ID oder ähnliches einstellt)?
- Wie man es testbar macht (insbesondere, wie man bei Bedarf einen gefälschten Benutzer bereitstellt)
Bitte helfen Sie mir, danke!
EDIT: Gibt es eine Möglichkeit, die Eigenschaft "User.Identity.Name" in "User.Identity.ID" zu ändern oder eine neue Eigenschaft hinzuzufügen, so dass es semantisch Sinn macht?