Ich entwickle eine MVC 5- Webanwendung mit dem Entity Framework 5 Database First- Ansatz. Ich verwende OWIN zur Authentifizierung von Benutzern. Unten sehen Sie meine Anmeldemethode in meinem Account Controller.
public ActionResult Login(LoginViewModel model, string returnUrl)
{
if (ModelState.IsValid)
{
var user = _AccountService.VerifyPassword(model.UserName, model.Password, false);
if (user != null)
{
var identity = new ClaimsIdentity(new[] { new Claim(ClaimTypes.Name, model.UserName), }, DefaultAuthenticationTypes.ApplicationCookie, ClaimTypes.Name, ClaimTypes.Role);
identity.AddClaim(new Claim(ClaimTypes.Role, "guest"));
identity.AddClaim(new Claim(ClaimTypes.GivenName, "A Person"));
identity.AddClaim(new Claim(ClaimTypes.Sid, user.userID)); //OK to store userID here?
AuthenticationManager.SignIn(new AuthenticationProperties
{
IsPersistent = model.RememberMe
}, identity);
return RedirectToAction("Index", "MyDashboard");
}
else
{
ModelState.AddModelError("", "Invalid username or password.");
}
}
// If we got this far, something failed, redisplay form
return View(model);
}
Wie Sie sehen, erstelle ich eine ClaimsIdentity , füge mehrere Claims hinzu und übergebe sie dann mit dem AuthenticationManager an OWIN , um die Anmeldung durchzuführen.
Das Problem, das ich habe, ist, dass ich nicht sicher bin, wie ich auf die Ansprüche im Rest meiner Anwendung zugreifen soll, weder in Controllern noch in Razor Views.
Ich hatte den in diesem Tutorial aufgeführten Ansatz ausprobiert
Ich habe dies beispielsweise in meinem Controller-Code versucht, um Zugriff auf die an die Ansprüche übergebenen Werte zu erhalten. Der Benutzer ist jedoch gleich null
var ctx = HttpContext.GetOwinContext();
ClaimsPrincipal user = ctx.Authentication.User;
IEnumerable<Claim> claims = user.Claims;
Vielleicht fehlt mir hier etwas.
AKTUALISIEREN
Basierend auf Darins Antwort habe ich seinen Code hinzugefügt, aber ich sehe immer noch keinen Zugriff auf die Ansprüche. Bitte sehen Sie den Screenshot unten, der zeigt, was ich sehe, wenn ich mit der Maus über die Identität schwebe.
Antworten:
Versuche dies:
quelle
Sie können dies auch tun:
Aktualisieren
Weitere Erläuterungen gemäß Kommentaren.
Wenn Sie Benutzer in Ihrem System wie folgt erstellen:
Es sollten automatisch einige Ansprüche in Bezug auf Ihre Identität ausgefüllt werden.
Um benutzerdefinierte Ansprüche hinzuzufügen, nachdem sich ein Benutzer authentifiziert hat, gehen Sie wie folgt vor:
Die Behauptungen können wieder vorgelesen werden, wie Darin oben geantwortet hat oder wie ich.
Die Ansprüche bleiben bestehen, wenn Sie unten anrufen und die Identität in übergeben:
quelle
Ich erstelle meine eigene erweiterte Klasse, um zu sehen, was ich brauche. Wenn ich sie in meinem Controller oder meiner Ansicht benötige, füge ich meinem Namespace nur die Verwendung hinzu:
In meinem Controller:
In meinem Rasiermesser:
quelle
return claim?.Value;
denn warum nichtDies ist eine Alternative, wenn Sie Ansprüche nicht ständig verwenden möchten. Schauen Sie sich dieses Tutorial von Ben Foster an.
Dann können Sie einen Basis-Controller hinzufügen.
In Ihrem Controller würden Sie Folgendes tun:
quelle
Um Darins Antwort weiter zu berühren, können Sie mithilfe der FindFirst- Methode zu Ihren spezifischen Ansprüchen gelangen :
quelle
Sie können dies auch tun.
quelle
Denken Sie daran, dass Sie zum Abfragen der IEnumerable auf system.linq verweisen müssen.
Sie erhalten das erforderliche Erweiterungsobjekt:
quelle
Es ist jedoch besser, die Ansprüche innerhalb der Methode "GenerateUserIdentityAsync" hinzuzufügen, insbesondere wenn regenerateIdentity in Startup.Auth.cs aktiviert ist.
quelle
GenerateUserIdentityAsync
war ein großartiger Vorschlag, ich habe ihn total übersehen. Vielen Dank Basil.Die kürzeste und vereinfachte Version der Antwort von @Rosdi Kasim ist
Claimname
ist der Anspruch, den Sie abrufen möchten, dh wenn Sie nach dem Anspruch "StreedAddress" suchen, lautet die obige Antwort wie folgtquelle
Gemäß der ControllerBase-Klasse können Sie die Ansprüche für den Benutzer abrufen, der die Aktion ausführt.
Hier erfahren Sie, wie Sie dies in einer Zeile tun können.
quelle
quelle
Ich habe es so in meinem Basis-Controller verwendet. Einfach teilen, um sofort einsatzbereit zu sein.
quelle