Komplexe Anspruch, Werte in .NET Framework mit System.Sicherheit.Ansprüche
Ich bin der Entwicklung einer web-app mit Asp.Net 5 MVC, Owin und Oauth2 bearer-token auth-Typ.
Folgenden diese Anleitung fügt hinzu, dass eine benutzerdefinierte komplexe Anspruch Json serialisiert zu einer Instanz von Microsoft.IdentityModel.Claims.ClaimsIdentity
mit Erfolg, ich habe versucht, zu replizieren die gleiche Beispiel mit dem "ClaimsIdentity" - auf die System.Security.Claims
namespace.
Leider, es scheint, dass das hinzufügen einer complexClaim
zu den ClaimsIdentity
Instanz der abgeleiteten Klasse Typ-Daten verloren, und die Forderung gespeichert ist, als ein System.Security.Claims.Claim
.
var complexClaim = new ComplexClaim<UKPassport>(@"http://it.test/currentpassport", passport);
var claims = new List<Claim>() { complexClaim };
identity.AddClaims(claims);
Wenn ich versuche, um wieder die Behauptung von Identität, Gießen Sie ihn auf eine ComplexClaim<UKPassport>
Art Ergebnisse in einen null-Wert.
var passportClaim = identity.Claims.FirstOrDefault<Claim>(c=>c.Type == @"http://it.test/currentpassport") as ComplexClaim<UKPassport>;
Das gleiche Beispiel funktioniert perfekt mit Microsoft.IdentityModel.Claims
.
Irgendwelche Tipps?
Hier ist die komplette portiert code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
using System.Security.Claims;
namespace ConsoleApplication1
{
class Program {
private static ClaimsIdentity identity = new ClaimsIdentity();
static void Main(string[] args)
{
var oldPassport = CreatePassport();
identity.AddPassport(oldPassport);
var britishCitizen = identity.IsBritishCitizen();
var hasExpired = identity.IsCurrentPassportExpired();
Console.WriteLine(hasExpired);
Console.ReadLine();
}
private static UKPassport CreatePassport()
{
var passport = new UKPassport(
code: PassportCode.GBR,
number: 123456789,
expiryDate: DateTime.Now);
return passport;
}
}
public static class ClaimsIdentityExtensions {
public static void AddPassport(this ClaimsIdentity identity, UKPassport passport)
{
var complexClaim = new ComplexClaim<UKPassport>(@"http://it.test/currentpassport", passport);
var claims = new List<Claim>() { complexClaim };
identity.AddClaims(claims);
}
public static bool IsCurrentPassportExpired(this ClaimsIdentity identity)
{
var passport = GetPassport(identity, @"http://it.test/currentpassport");
return DateTime.Now > passport.ExpiryDate;
}
public static bool IsBritishCitizen(this ClaimsIdentity identity)
{
var passport = GetPassport(identity, @"http://it.test/currentpassport");
return passport.Code == PassportCode.GBR;
}
private static UKPassport GetPassport(this ClaimsIdentity identity, string passportType)
{
var passportClaim = identity.Claims.FirstOrDefault<Claim>(c=>c.Type == @"http://it.test/currentpassport") as ComplexClaim<UKPassport>;
return passportClaim.Value;
}
}
public enum PassportCode
{
GBR,
GBD,
GBO,
GBS,
GBP,
GBN
}
public class ComplexClaim<T> : Claim where T : ClaimValue
{
public ComplexClaim(string claimType, T claimValue)
: this(claimType, claimValue, string.Empty)
{
}
public ComplexClaim(string claimType, T claimValue, string issuer)
: this(claimType, claimValue, issuer, string.Empty)
{
}
public ComplexClaim(string claimType, T claimValue, string issuer, string originalIssuer)
: base(claimType, claimValue.ToString(), claimValue.ValueType(), issuer, originalIssuer)
{
}
public new T Value
{
get
{
return JsonConvert.DeserializeObject<T>(base.Value);
}
}
}
public class UKPassport : ClaimValue
{
public const string Name = "UKPassport";
private readonly PassportCode code;
private readonly int number;
private readonly DateTime expiryDate;
public UKPassport(PassportCode code, int number, DateTime expiryDate)
{
this.code = code;
this.number = number;
this.expiryDate = expiryDate;
}
public PassportCode Code { get { return this.code; } }
public int Number { get { return this.number; } }
public DateTime ExpiryDate { get { return this.expiryDate; } }
public override string ValueType()
{
return @"http://it.test/currentpassport";
}
}
public abstract class ClaimValue {
public abstract string ValueType();
public override string ToString()
{
return JsonConvert.SerializeObject(this);
}
}
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies wird nicht unterstützt, noch empfohlen - die Ansprüche sind Schlüssel /Wert-Paaren, halten Sie Sie so einfach wie möglich.
Gibt es eine Reihe von unterstützenden Klassen .NET, die können nicht damit umgehen, was Sie versuchen zu erreichen (der SAM, CookieMiddleware etc)..
siehe auch hier
http://leastprivilege.com/2012/10/08/custom-claims-principals-in-net-4-5/
Besetzung im
GetPassport
versucht zu konvertieren von Basis-TypClaim
zu abgeleiteten TypComplexClaim<UKPassport>
die Folge null.Sie schreiben ein cast-operator konvertiert wird
Claim
zuUKPassport
sowie
GetPassport
werden