Ich verwende MVC5 Identity 2.0, damit sich Benutzer bei meiner Website anmelden können, auf der die Authentifizierungsdetails in einer SQL-Datenbank gespeichert sind. Asp.net Identity wurde standardmäßig implementiert, wie in vielen Online-Tutorials zu finden ist.
Die ApplicationUser-Klasse in IdentityModels wurde um einige benutzerdefinierte Eigenschaften erweitert, z. B. eine ganzzahlige Organisations-ID. Die Idee ist, dass viele Benutzer für Datenbankbeziehungszwecke erstellt und einer gemeinsamen Organisation zugewiesen werden können.
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 die OrganizationId-Eigenschaft des aktuell angemeldeten Benutzers von einem Controller aus abrufen? Ist dies über eine Methode verfügbar, sobald ein Benutzer angemeldet ist, oder muss ich die Organisations-ID jedes Mal, wenn eine Controller-Methode ausgeführt wird, basierend auf der Benutzer-ID aus der Datenbank abrufen?
Beim Lesen im Web muss ich Folgendes verwenden, um die angemeldete Benutzer-ID usw. zu erhalten.
using Microsoft.AspNet.Identity;
...
User.Identity.GetUserId();
OrganizationId ist jedoch keine in User.Identity verfügbare Eigenschaft. Muss ich User.Identity erweitern, um die OrganizationId-Eigenschaft einzuschließen? Wenn ja, wie gehe ich vor?
Der Grund, warum ich die Organisations-ID so oft benötige, ist, dass viele Tabellenabfragen von der Organisations-ID abhängen, um Daten abzurufen, die für die Organisation relevant sind und dem angemeldeten Benutzer zugeordnet sind.
Antworten:
Wenn Sie die Eigenschaften von User.Identity um zusätzliche Eigenschaften wie die obige Frage erweitern möchten, fügen Sie diese Eigenschaften zunächst wie folgt zur ApplicationUser-Klasse hinzu:
Dann müssen Sie eine Erweiterungsmethode wie diese erstellen (ich erstelle meine in einem neuen Erweiterungsordner):
Wenn Sie die Identität in der ApplicationUser-Klasse erstellen, fügen Sie einfach die Claim -> OrganizationId wie folgt hinzu:
Wenn Sie den Anspruch hinzugefügt und Ihre Erweiterungsmethode eingerichtet haben, um ihn als Eigenschaft für Ihre User.Identity verfügbar zu machen, fügen Sie auf der Seite / Datei, auf die Sie zugreifen möchten, eine using-Anweisung hinzu :
in meinem Fall:
using App.Extensions;
innerhalb eines Controllers und@using. App.Extensions
mit einer .cshtml View-Datei.BEARBEITEN:
Sie können auch vermeiden, dass in jeder Ansicht eine using-Anweisung hinzugefügt wird, indem Sie in den Ordner "Ansichten" wechseln und dort die Datei "Web.config" suchen. Suchen Sie nun nach dem
<namespaces>
Tag und fügen Sie dort Ihren Erweiterungs-Namespace wie folgt hinzu:Speichern Sie Ihre Datei und Sie sind fertig. Jetzt kennt jede Ansicht Ihre Erweiterungen.
Sie können auf die Erweiterungsmethode zugreifen:
quelle
Ich suchte nach der gleichen Lösung und Pawel gab mir 99% der Antwort. Das einzige, was fehlte, damit die Erweiterung angezeigt werden konnte, war das Hinzufügen des folgenden Razor-Codes zur cshtml-Seite (Ansicht):
@using programname.Models.Extensions
Ich habe nach dem Vornamen gesucht, der oben rechts in meiner NavBar angezeigt wird, nachdem sich der Benutzer angemeldet hat.
Ich dachte, ich würde dies posten, falls es jemand anderem hilft. Also hier ist mein Code:
Ich habe einen neuen Ordner mit dem Namen "Erweiterungen" (unter meinem Modellordner) erstellt und die neue Klasse als oben angegebenes Pawel erstellt:
IdentityExtensions.cs
IdentityModels.cs
::Dann habe ich in meinen
_LoginPartial.cshtml
(UnterViews/Shared
Ordnern) hinzugefügt@using.ProgramName.Models.Extensions
Ich habe dann die Änderung zu der folgenden Codezeile hinzugefügt, die nach dem Anmelden den Vornamen des Benutzers verwenden sollte:
@Html.ActionLink("Hello " + User.Identity.GetUserFirstname() + "!", "Index", "Manage", routeValues: null, htmlAttributes: new { title = "Manage" })
Vielleicht hilft das jemand anderem auf der ganzen Linie.
quelle
Lesen Sie diesen großartigen Blog-Beitrag von John Atten: ASP.NET Identity 2.0: Anpassen von Benutzern und Rollen
Es enthält großartige Schritt-für-Schritt-Informationen zum gesamten Prozess. Geh und lies es :)
Hier sind einige der Grundlagen.
Erweitern Sie die Standard-ApplicationUser-Klasse, indem Sie neue Eigenschaften hinzufügen (z. B. Adresse, Stadt, Bundesland usw.):
Anschließend fügen Sie Ihrem RegisterViewModel Ihre neuen Eigenschaften hinzu.
Aktualisieren Sie anschließend die Registeransicht, um die neuen Eigenschaften einzuschließen.
Aktualisieren Sie dann die Register () -Methode in AccountController mit den neuen Eigenschaften.
quelle
Für alle, die diese Frage finden und nach dem Zugriff auf benutzerdefinierte Eigenschaften in ASP.NET Core 2.1 suchen, ist dies viel einfacher: Sie haben einen UserManager, z. B. in _LoginPartial.cshtml, und können dies dann einfach tun (vorausgesetzt, "ScreenName" ist a Eigenschaft, die Sie Ihrem eigenen AppUser hinzugefügt haben, der von IdentityUser erbt):
quelle
GetUserAsync(User)
die Datenbank abgefragt wird, um die Organisations-ID abzurufen. Im Gegensatz dazu enthält die akzeptierte Lösung die Organisations-ID in den Ansprüchen (z. B. Cookie). Der Vorteil des Abrufs dieser Informationen aus der Datenbank besteht darin, dass Personen zwischen Organisationen verschoben werden können, ohne dass sie sich abmelden / anmelden müssen. Der Nachteil ist natürlich, dass eine zusätzliche Datenbankabfrage erforderlich ist.Dhaust bietet eine gute Möglichkeit, die Eigenschaft zur ApplicationUser-Klasse hinzuzufügen. Wenn man sich den OP-Code ansieht, scheint es, dass sie dies getan haben oder auf dem richtigen Weg waren, dies zu tun. Die Frage fragt
Pawel bietet eine Möglichkeit, eine Erweiterungsmethode hinzuzufügen, für die Anweisungen verwendet oder der Namespace zur Datei web.config hinzugefügt werden muss.
In der Frage wird jedoch gefragt, ob Sie User.Identity um die neue Eigenschaft erweitern müssen. Es gibt eine alternative Möglichkeit, auf die Eigenschaft zuzugreifen, ohne User.Identity zu erweitern. Wenn Sie die Dhaust-Methode befolgt haben, können Sie den folgenden Code in Ihrem Controller verwenden, um auf die neue Eigenschaft zuzugreifen.
quelle
Ich hatte auch zusätzliche Spalten zu meiner AspNetUsers-Tabelle hinzugefügt oder erweitert. Als ich diese Daten einfach anzeigen wollte, fand ich viele Beispiele wie den obigen Code mit "Erweiterungen" usw. Dies hat mich wirklich erstaunt, dass Sie all diese Codezeilen schreiben mussten, um ein paar Werte von den aktuellen Benutzern zu erhalten.
Es stellt sich heraus, dass Sie die AspNetUsers-Tabelle wie jede andere Tabelle abfragen können:
quelle