2014-12-08 15 views
6

Ich arbeite an einem Authentifizierungssystem, das ASP.NET Identity mit Entity Framework verwendet, und ich möchte einige Ansprüche haben, die errechnete Werte sind, anstatt in der Anspruchstabelle fest codiert zu sein .Dynamische Benutzeransprüche in ASP.NET Identity EF

Wie kann ich bei der Anmeldung eines Benutzers dynamische Ansprüche zu dieser Anmeldesitzung hinzufügen, ohne sie tatsächlich zur Anspruchstabelle hinzuzufügen?

Zum Beispiel möchte ich die DOB jedes Benutzers speichern, aber ich möchte IsBirthday als eine Forderung hinzufügen, wenn das Anmeldedatum mit dem DOB des Benutzers übereinstimmt. Ich möchte nicht für jeden Benutzer einen "IsBirthday" -Anspruch speichern müssen, da dieser täglich für alle geändert wird.

In meinem Code verwende ich diese eingeloggt sein:

var signInResult = await SignInManager.PasswordSignInAsync(username, password, false, false); 

Danach heißt ich die ClaimsPrincipal verweisen kann, aber die Ansprüche Eigenschaft ist ein IEnumerable, keine Liste, so kann ich nicht hinzufügen zu ihm.

EDIT: Ich sollte auch erwähnen, dass ich die Bibliotheken Microsoft.AspNet.Identity.Owin verwende.

+0

Per Chris Pratt Antwort, unter diesem Setup würde ich DOB als eine Eigenschaft auf dem Modell speichern. – zaparker

Antwort

11

OK, alle, ich habe ein wenig nach den Klassen gesucht, die in ASP.NET Identity zur Verfügung gestellt wurden, und habe die gefunden, die ich außer Kraft setzen musste. Die SignInManager-Klasse verfügt über eine CreateUserIdentityAsync-Methode, die genau das tut, was ich wollte. Der folgende Code hat den IsBirthday-Anspruch meiner Identität hinzugefügt, aber nicht in der Datenbank gespeichert.

public class ApplicationSignInManager : SignInManager<ApplicationUser, string> 
{ 
    public override async Task<System.Security.Claims.ClaimsIdentity> CreateUserIdentityAsync(ApplicationUser user) 
    { 
     var identity = await base.CreateUserIdentityAsync(user); 
     identity.AddClaim(new System.Security.Claims.Claim("IsBirthday", user.DOB.GetShortDateString() == DateTime.Now.GetShortDateString())); 
     return identity; 
    } 

    // ... EXCLUDING OTHER STUFF LIKE CONSTRUCTOR AND OWIN FACTORY METHODS ... 
}