So verlängern Sie die verfügbaren Eigenschaften des Benutzers.Identität
Ich bin mit MVC5 Identität 2.0 für Nutzer zum einloggen in meine Seite, wo die Authentifizierungs-Daten werden in einer SQL-Datenbank. Asp.net Identität umgesetzt wurde, in einem standard-Weg, wie kann man in vielen online-tutorials.
Den ApplicationUser Klasse in IdentityModels wurde erweitert um einige benutzerdefinierte Eigenschaften, wie z.B. eine Ganzzahl OrganizationId. Die Idee ist, dass viele Benutzer können erstellt und zugewiesen werden, um eine gemeinsame Organisation für die Datenbank Beziehung Zwecke.
public class ApplicationUser : IdentityUser
{
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
{
//Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
//Add custom user claims here
return userIdentity;
}
//Extended Properties
public DateTime? BirthDate { get; set; }
public long? OrganizationId { get; set; }
//Key Mappings
[ForeignKey("OrganizationId")]
public virtual Organization Organization { get; set; }
}
Wie kann ich abrufen, die OrganizationId Eigenschaft des aktuell angemeldeten Benutzers aus einem controller?
Ist dies über eine Methode, sobald ein Benutzer angemeldet ist oder muss ich immer das abrufen der OrganizationId aus der Datenbank, basierend auf der Benutzer-id, jedes mal, wenn Sie eine controller-Methode wird ausgeführt?
Lesen, um auf dem web, die ich gesehen habe, die ich verwenden müssen Sie die folgenden Informationen, um die angemeldete UserId etc.
using Microsoft.AspNet.Identity;
...
User.Identity.GetUserId();
Jedoch, OrganizationId ist keine Eigenschaft zur Verfügung, die im User.Identität. Brauche ich, um Benutzer erweitern.Identität gehören die OrganizationId Eigenschaft? Wenn ja, wie gehe ich über dieses.
Den Grund brauche ich die OrganizationId so oft ist, dass viele table-Abfragen sind abhängig von der OrganizationId zum abrufen von Daten in Bezug auf die Organisation, die verbunden ist, um den angemeldeten Benutzer.
So ziemlich die gleiche Antwort von mir hier: stackoverflow.com/a/28138594/809357 - wenn Sie diese Informationen regelmäßig in das Leben der Anfrage, können Sie legen Sie es auf den cookie als eine Behauptung.
Danke @Schuh sowohl in Ihrer Antwort, gearbeitet. Zusätzlich zu Ihren Antworten, die ich hatte, um einen Anspruch auf die im cookie gespeichert. In der IdentityModels Klasse, die ich hatte, um userIdentity.AddClaim(neuen Claim("MyApp:OrganizationId", OrganizationId.ToString())); public async Task< "ClaimsIdentity" - > GenerateUserIdentityAsync(UserManager<ApplicationUser> manager) - Methode.
Danke auch @trailmax Leid, ich habe zu danken, die Sie in einem anderen Kommentar, Stackoverflow kann nur ein Benutzer einen Namen pro Kommentar.
InformationsquelleAutor RobHurd | 2015-02-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wann immer Sie möchten, erweitern Sie die Eigenschaften des Benutzers.Identität mit zusätzlichen Eigenschaften, wie die Frage vor, fügen Sie diese Eigenschaften, um die ApplicationUser ersten Klasse etwa so:
Dann, was Sie brauchen ist eine Erweiterung Methode so (ich erstelle mir in einem neuen Ordner "Extensions"):
Beim erstellen der Identität in der ApplicationUser Klasse, nur hinzufügen, dass der Anspruch -> OrganizationId etwa so:
Sobald Sie Hinzugefügt, die Forderung und Ihre Erweiterung Methode in Ort, um es als Eigenschaft auf Ihre Benutzer.Identität, fügen Sie eine using-Anweisung auf der Seite/Datei, die Sie zugreifen möchten es:
in meinem Fall:
using App.Extensions;
in einem Controller, und@using. App.Extensions
innerhalb eines .cshtml Datei Anzeigen.EDIT:
Was können Sie auch tun, vermeiden Sie, indem Sie eine using-Anweisung in jeder Ansicht ist zu gehen, um die Aussicht auf Ordner, und suchen Sie die Web.config Datei vorhanden.
Suchen Sie jetzt die
<namespaces>
- tag und fügen Sie Ihre namespace-Erweiterung gibt es etwa so:Speichern Sie Ihre Datei und Sie sind fertig. Jetzt in jeder Ansicht werden erkennen, dass Ihre Erweiterungen.
Können Sie den Zugriff auf die Extension-Methode:
Hoffe, das hilft jemand 🙂
Wann ist es geschehen? Wenn Sie versuchen, um das behaupten oder wenn Sie versuchen, um Zugriff auf dessen Wert später in den code? Wenn es beim hinzufügen einer behaupten, dann stellen Sie sicher, dass Ihre ApplicationUser hat die Eigenschaft definiert... Wenn es später in den code dann vergessen Sie nicht, fügen Sie die using-Anweisung, wo Sie erstellt die extension-Methode wie: verwenden der App.Erweiterungen;
Habe Fehler in userIdentity.AddClaim Linie. Ich habe das IdentityExtensions Klasse in IdentityModels.cs-Datei, die nur. Kann das sein das eine Quelle des Problems?
Nope, wenn es ist, wenn Sie hinzufügen, die behaupten, es passiert viel vor identityExtensions ins Spiel kommen (das ist, wenn Sie Lesen Sie den Wert zurück)... Stellen Sie sicher, dass Ihre ApplicationUser hat die Eigenschaft, die Sie versuchen, hinzufügen, ein Anspruch: in diesem Beispiel war es der öffentlichkeit lange OrganizationId { get; set; }
Vielen Dank, es hat funktioniert. Ich denke, das ist die beste übung für den benutzerdefinierten Variablen in Asp Net Idendity 2. Ich weiß nicht, warum Asp.Net Gemeinschaft nicht bieten ein solches Beispiel in Standard-Artikel auf Ihren websites.
InformationsquelleAutor Pawel
Ich war auf der Suche nach der gleichen Lösung und Pawel hat mir 99% der Antwort. Das einzige, was fehlte, brauchte ich für die Erweiterung auf dem display war das hinzufügen der folgenden Razor Code in der cshtml(Ansicht) Seite:
@using programname.Models.Extensions
Ich war auf der Suche nach der Vorname, um die Anzeige in der oberen rechten meiner NavBar, nachdem der Benutzer sich angemeldet hat.
Ich dachte, ich würde post dies für den Fall es jemandem hilft, hier ist mein code:
Ich erstellte einen neuen Ordner namens "Extensions" (Unter mein Models Ordner) und erstellt die neue Klasse als Pawel oben angegeben:
IdentityExtensions.cs
IdentityModels.cs
:Dann in meinem
_LoginPartial.cshtml
(UnterViews/Shared
Ordner) ich habe@using.ProgramName.Models.Extensions
Habe ich dann Hinzugefügt, das die änderung des nächsten Workshops Zeile des Codes, wurde der Benutzer Erste name nach der Anmeldung :
@Html.ActionLink("Hello " + User.Identity.GetUserFirstname() + "!", "Index", "Manage", routeValues: null, htmlAttributes: new { title = "Manage" })
Vielleicht hilft jemand anderes auf der ganzen Linie.
InformationsquelleAutor AxleWack
Schauen Sie sich diese große blog-post von John Atten:
ASP.NET Identität 2.0: Customizing-Benutzer und-Rollen
Es hat tolle Schritt-für-Schritt-Informationen auf, den gesamten Prozess. Bitte Lesen : )
Hier sind einige der Grundlagen.
Erweitern die Standard-ApplicationUser Klasse durch hinzufügen von neuen Eigenschaften (z.B. Adresse, Stadt, Staat etc.):
Fügen Sie dann Ihre neuen Eigenschaften an Ihre RegisterViewModel.
Dann aktualisieren Sie das Register Ansicht, um die neuen Eigenschaften.
Aktualisieren Sie dann die Register () - Methode auf AccountController mit neuen Eigenschaften.
Dies ist gutes Beispiel dafür, aber es beantwortet nicht die Frage ist, wie bekommt man diese neuen Eigenschaften Nutzers.Identität.
Downvoted weil die Antwort nicht zeigen, wie die benutzerdefinierten Eigenschaften können abgerufen werden der Benutzer.Identität.
InformationsquelleAutor Dhaust
Für jeden, der Sie findet, diese Frage suchen, wie das zugreifen auf benutzerdefinierte Eigenschaften in ASP.NET Core 2.1 - es ist viel einfacher: Sie haben einen UserManager, z.B. in _LoginPartial.cshtml, und dann können Sie einfach tun (vorausgesetzt, "ScreenName" ist eine Eigenschaft, die Sie Hinzugefügt haben, um Ihre eigenen AppUser die erbt von IdentityUser):
GetUserAsync(User)
wird die Abfrage der Datenbank und ruft die OrganizationId. Im Gegensatz dazu ist die akzeptierte Lösung wird auch die OrganizationId in den Ansprüchen (z.B. cookie). Der Vorteil von ziehen Informationen aus der Datenbank ist, dass die Menschen bewegt werden können, zwischen Organisationen, ohne dass diese logout/login. Natürlich, der Nachteil ist, dass es erfordert eine zusätzliche Datenbank-Abfrage.InformationsquelleAutor Jashan
Dhaust gibt einen guten Weg, um die Eigenschaft hinzufügen, um die ApplicationUser Klasse. Blick auf den OP-code, es scheint, Sie haben dies getan, oder waren auf der Strecke zu tun. Die Frage fragt
Pawel gibt einen Weg, um eine Erweiterung hinzuzufügen Methode, die erfordert die Verwendung von Angaben oder das hinzufügen der Namensraum des Internet.config-Datei.
Jedoch die Frage fragt, wenn Sie "müssen" erweitern Benutzer.Identität, um die neue Eigenschaft. Es ist ein alternativer Weg, um auf die Eigenschaft zugreifen, auch ohne die Benutzer.Identität. Wenn Sie anschließend Dhaust Methode, die Sie können, dann verwenden Sie den folgenden code in Ihr controller Zugriff auf die neue Eigenschaft.
InformationsquelleAutor codeMethod
Hatte ich auch auf Hinzugefügt oder erweitert, sind weitere Spalten in meiner Tabelle AspNetUsers. Ich wollte einfach nur diese Daten anzeigen fand ich viele Beispiele, wie der code oben mit "Erweiterungen" etc... Das mich wirklich erstaunt, dass Sie schreiben musste, alle diejenigen Zeilen code, nur um ein paar Werte aus der aktuellen Benutzer.
Es stellt sich heraus, dass Sie eine Abfrage der Tabelle AspNetUsers wie jede andere Tabelle:
InformationsquelleAutor Anthony Griggs