2017-10-06 3 views
2

Ich entwickle eine ASP.Net-Anwendung mit OWIN und derzeit habe ich ein Problem mit Ansprüchen. Ich habe zwei Ebenen der Anwendung: Basic und Advanced. Einige Funktionen sind nur für erfahrene Benutzer verfügbar. Also ich überprüfen Ansprüche, und wenn Benutzer nicht Anspruch advanced Ich kehre 403. Aber auch hier fand ich das Problem zu umgehen, die dieses System ruiniert:Erzwingen ASP.Net Ansprüche Validierung, nachdem sie geändert wurden

  • Benutzer aktiviert erweiterten Modus
  • er eine Aktion ausführt und seinen Zugriff speichern Token
  • Er deaktiviert erweiterten Modus
  • Jetzt ist er in der Lage, Aktionen durchzuführen, wie er im erweiterten Modus mit diesem Token ist, aber er hat eigentlich keine Berechtigungen, es zu tun.

Ich versuche, einige feine Lösung für diese Situation zu finden, aber ich habe keine Ideen, außer set 1 minute timeout oder always check AspNetUserClaims instead of cookie und so weiter, aber sie nicht in meinem Fall arbeiten, weil er ein Leben lang Feature in diesem aktiviert Minutenintervall und dann für immer verwenden.

Aber ich möchte einige serverseitige Flag wie oops, this guy have just changed his cookies, check it from database oder etwas zu niedrigeren Datenbank-Roundtrips für allgemeine API-Aufrufe setzen.

Gibt es eine Standard-Standardmethode? Oder habe ich gerade ein falsches Instrument gewählt?

+0

In Identität können Sie einfach den Benutzer abmelden und sie in programmatisch wieder anmelden. Scheint so, würde das ihren Cookie prellen und IPrincipal – Eonasdan

+0

@Eonasdan Ich weiß nicht, wann ich den Benutzer abmelden soll. Für jede Anfrage? Alle 5 Minuten? Wenn der ehemalige dann ist es einfach nutzlos. Wenn Letzterer als Benutzer 5 Minuten Zeit hat, alles zu tun. –

+0

"Benutzer aktiviert erweiterten Modus" -> Bounce-Login -> "Er deaktiviert erweiterten Modus" -> Bounce-Login – Eonasdan

Antwort

0

Unfortunly, die einzige Art, wie ich gefunden Abfrage tatsächlich DB selbst und prüfen, ob Benutzer gültige Anmeldeinformationen haben:

public bool HasRequiredClaims(string[] requiredClaims) 
{ 
    using (var context = new ApplicationDbContext()) 
    { 
     int actualNumberOfClaims = context.Users 
      .SelectMany(x => x.Claims) 
      .Count(c => requiredClaims.Contains(c.ClaimValue)); // claim values are unique per user (in my case) so I don't have to filter on user 
     return actualNumberOfClaims == claimsValuesToSearch.Length; 
    } 
} 
0

Sie müssen Aktualisierungscookies gemäß Ihrem Anspruchswert senden.

Im Folgenden finden Sie einen Code zur Aktualisierung Ihres Anspruchswerts.

In Ihrer Aktion, wenn Benutzer erweiterten Modus deaktivieren/aktivieren, aktualisieren Sie dann Benutzer claims.

var isAdvanced= "1";  

var identity = (ClaimsIdentity)User.Identity; 

// check if claim exist or not. 
var existingClaim = identity.FindFirst("IsAdvanced"); 
if (existingClaim != null) 
    identity.RemoveClaim(existingClaim); 

// add/update claim value. 
identity.AddClaim(new Claim("IsAdvanced", isAdvanced)); 

IOwinContext context = Request.GetOwinContext(); 

var authenticationContext = await context.Authentication.AuthenticateAsync(DefaultAuthenticationTypes.ExternalCookie); 

if (authenticationContext != null) 
{ 
    authenticationManager.AuthenticationResponseGrant = new AuthenticationResponseGrant(identity,authenticationContext.Properties); 
} 

Sobald Sie eine Umleitung gemacht wird, werden Sie Ihren get aktualisiert Anspruch Wert erhalten, daher brauchen Sie nicht Datenbank Rundfahrt zu machen.

Credit to this post.

+0

Aber was ist über gespeicherte Anfrage? Zum Beispiel hat er gerade das Chrome-Feature 'save as cUrl' verwendet und die Anfrage dann manuell gesendet? Es hat immer noch einen Cookie mit diesem Wert. Ich entferne es für die nächsten Anfragen, aber es ist egal, weil ich nichts auf der Serverseite überprüfe. Oder bin ich? –

+0

@AlexZhukovskiy: Nein, es wird nicht funktionieren, wenn Sie eine Anfrage manuell mit alten Cookies senden. Weil alte Cookies den Wert "1" haben. –

+0

@AlexZhukovskiy: Was ist die Ablaufzeit des Cookie-Tokens? –

Verwandte Themen