2016-04-28 9 views
1

In meiner MVC-Anwendung habe ich zwei Unterklassen der grundlegenden ASP Identity ApplicationUser Klasse erstellt mit TPT inheritance, und möchte einige Ansprüche auf die Objekte hinzufügen, damit ich die Eigenschaften aus der Unterklassen in Ansichten.Hinzufügen von Ansprüchen zu einer Unterklasse von ApplicationUser

Ich muss einen einfachen Trick vermissen/habe ein grundlegendes Missverständnis der ASP Identity Setup, aber ich kann nicht sehen, wie dies zu tun ist.

Hinzufügen von Ansprüchen an die ApplicationUser Klasse wäre einfach, aber die Methode, wo Sie dies tun, kann nicht in den Unterklassen überschrieben werden, damit ich es dort tun kann.

Gibt es eine Möglichkeit, dies zu erreichen, einfach (wie alles andere mit dieser Einrichtung arbeitet gut), oder muss ich meine zwei ApplicationUser Subklassen einrichten direkt von IdentityUser erben, und richten Sie zwei Lose Config für sie beide in IdentityConfig.cs?

Die Klassen ich spreche, sind wie folgt:

//The ApplicationUser 'base' class 
public class ApplicationUser : IdentityUser 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string ProfilePicture { get; set; } 

    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 

     //** can add claims without any problems here ** 
     userIdentity.AddClaim(new Claim(ClaimTypes.Name, String.Format("{0} {1}", this.FirstName, this.LastName)));I 

     return userIdentity; 
    } 
} 

public class MyUserType1 : ApplicationUser 
{ 
     [DisplayName("Job Title")] 
     public string JobTitle { get; set; } 

     //** How do I add a claim for JobTitle here? ** 
} 


public class MyUserType2 : ApplicationUser 
{ 
     [DisplayName("Customer Name")] 
     public string CustomerName { get; set; } 

     //** How do I add a claim for CustomerName here? ** 
} 

Antwort

3

Sie GenerateUserIdentityAsync eine virtuelle Methode in ApplicationUser machen können, die Ihnen die Umsetzung in Ihrem konkreten Typen außer Kraft setzen würde erlauben.

Das ist die sauberste Option, die ich sehen kann.

+0

Ich möchte jedoch Ansprüche für Eigenschaften innerhalb der beiden Unterklassen hinzufügen, die in der Basisklasse nicht verfügbar wären, sorry, wenn ich das nicht sehr gut beschreiben würde. – Ted

+1

Ja, ich verstehe, was du meinst. Könnten Sie GenerateUserIdentityAsync in der Basisklasse virtuell machen und dann in den konkreten Klassen überschreiben? Noch besser wäre es, es abstrakt zu machen, aber ich vermute, dass Sie dies nicht tun können, da ApplicationUser IdentityUser implementiert –

+1

Brilliant, ja, das ist es natürlich. Ich hatte es in meinem Kopf, dass die GenerateUserIdentityAsync-Methode Teil der IdentityUser-Schnittstelle war und nicht geändert werden konnte, und ich gebe zu, dass ich den virtuellen Modifizierer vorher noch nicht verwendet habe (nur abstrakt), also wahrscheinlich nicht habe trotzdem daran gedacht, vielen dank! (Wenn Sie Ihre Antwort bearbeiten möchten, um dies stattdessen zu empfehlen, werde ich sie akzeptieren und aktualisieren) – Ted

Verwandte Themen