Wie entferne ich einen bestehenden Anspruch aus einem ClaimsPrinciple?
Ich mache ein Entwickler-tool für die Identität Roles
für eine intranet-Website, um Entwicklern zu ermöglichen, schnell zu handeln, als irgendwelche Role
als nötig. Rollen definiert sind Developer, Team Lead, Team Member, Engineering, Marketing, Guest
und ein tool auf der web-Seite macht einen Anruf an eine Web-Api zum hinzufügen oder entfernen der Claim
... nun, ich kann hinzufügen, aber kann nicht scheinen, um herauszufinden, wo die .RemoveClaim(claim)
oder .TryRemoveClaim(claim)
zugegriffen werden kann, damit es funktioniert. Muss ich zum erstellen eines benutzerdefinierten Ansprüche-manager, um diese Funktion, oder bin ich etwas fehlt?
Schaue ich System.Sicherheit.Ansprüche und fast alles andere scheint zu funktionieren sehr unkompliziert und es gibt keine Referenz zu benötigen umfangreiche Arbeit zu tun, was ich brauche.
Ich bin mit VS 2013/Web-Api2 mit .NET 4.5.1.
Die Webseite Seite verwendet ein einfaches ajax-Aufruf PUT
und DELETE
Funktionalität, bis ich diese zu arbeiten, wie ich will. Von der Steuerung, der meinen cs code:
public void Put(int id, [FromBody]string role)
{
if (FindClaim(role) != null) return;
var user = HttpContext.Current.User as ClaimsPrincipal;
if (user == null) return;
var claimId = new ClaimsIdentity();
claimId.AddClaim(new Claim(ClaimTypes.Role, role));
user.AddIdentity(claimId);
}
//DELETE api/devroleadjuster/5
public void Delete(int id, [FromBody]string role)
{
var claim = FindClaim(role);
if (claim == null) return;
var user = HttpContext.Current.User as ClaimsPrincipal;
if (user == null) return;
//Why can't I do this????
user.RemoveClaim(claim);
}
private Claim FindClaim(string role)
{
try
{
var user = HttpContext.Current.User as ClaimsPrincipal;
var claim = (from c in user.Claims
where c.Value == role
select c).Single();
return claim;
}
catch (InvalidOperationException)
{
return null;
}
}
Den Put
funktioniert Prima, das problem ist mit der Delete
Teil von meinem code... ich will das user.RemoveClaim(claim);
code oder so etwas in der Art... ich kann nicht sehen, warum kann ich nicht nach MSDN, und ich finde keine Beispiel-code für das entfernen einer Forderung.
InformationsquelleAutor der Frage Greg Mason | 2014-03-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie verwenden, Identität hinzufügen oder entfernen einer Forderung. Versuchen Sie dies zu fügen Sie einen Anspruch.
Zu entfernen, ein Anspruch,
BTW, ist es besser, zu verwenden
User
von Ihrem controller stattHttpContext.Current.User
.InformationsquelleAutor der Antwort Badri
Etwas anderes, das ist wichtig hinzuzufügen ist, um sicherzustellen, dass Sie nicht versuchen, zu Durchlaufen die Auflistung der Forderungen und Elemente zu entfernen. Ich bin einfach über buggy-code von jemand anderen geschrieben worden, und auf den ersten ich didn ' T sehen das problem, bis ich trat durch es.
Der fehlerhafte code war:
Das Ergebnis war, dass die Forderungen waren uneinheitlich aus der Liste entfernt. Die einfache Lösung für das problem der Iteration über eine Liste von Forderungen, und nicht die Forderungen selbst, und entfernen Sie auf diese Weise:
Es ist nie eine gute Idee zur Iteration über eine Sammlung und Elemente hinzufügen oder entfernen. Sie werden sehen, sporadische Fehler und unterschiedliche Ergebnisse je nach der situation, und in einigen Fällen, wie die Iteration über Elemente in HttpContext.Aktuelle.Elemente, die Sie werden sehen, sporadische Fehler über die Erhebung geändert wird.
InformationsquelleAutor der Antwort David Spenard