2016-06-15 16 views
0

Ich arbeite derzeit mit CRUD in Identität. Aber ich kann das knacken. Ich versuche, es so zu machen, dass Sie NUR löschen können, wenn Sie eingeloggt sind.Verhindern Benutzer nicht zu löschen, wenn nicht angemeldet

Ich habe versucht, indem Sie if (User.Identity.IsAuthenticated) hinzufügen Aber das funktioniert nicht, es senden Sie mich zur Anmeldeseite NACHDEM Sie die Löschseite eingegeben hatten. Das ist mein Controller:

public ActionResult _RemoveItems() 
    { 
     var Items = db.CreatePosts.ToList(); 

     return PartialView(Items); 
    } 

    [HttpPost] 
    public ActionResult _RemoveItem(int Id) 
    { 
     if (HttpContext.User.Identity.IsAuthenticated) 
     { 
      CreatePost CreatePost = db.CreatePosts.Find(Id); 
      if (CreatePost != null) 
      { 
       db.CreatePosts.Remove(CreatePost); 
       db.SaveChanges(); 
      } 
     } 
     return RedirectToAction("Index", "Manage"); 
    } 

Und das ist mein löschen

@Html.ActionLink("Slet", "_RemoveItem", "Home", new { @id = item.Id }, new { @class = "btn btn-danger" }) 

Was mache ich falsch, da ich es nicht machen können, so müssen Sie eingeloggt sein, bevor Sie die Seite eingeben _RemoveItem

+0

Wenn der Link in Ihrer * Ansicht * vorhanden ist, dann wird der Eindruck entstehen, dass die Option zum Löschen erlaubt ist, wenn nicht angemeldet. Von dem, was Sie gepostet haben, sieht es nicht so aus löschen, aber es würde sie zurück zur Indexseite umleiten, ohne zu erklären, was passiert ist. Ich glaube nicht, dass Sie den Benutzer daran hindern können, in den Lösch-Controller zu gehen (ohne einen Filter zu erstellen), aber Sie können verhindern, dass sie den Code-Inhalt der Aktion ausführen, wenn sie nicht eingeloggt sind, sondern "Identity.IsUserAuthenticated" sollte den Trick machen. –

+0

Das Problem ist, dass es nicht warum? Ich weiß es nicht. Ich habe es wahrscheinlich falsch gestellt, aber wo es platziert werden sollte, weiß ich nicht. –

+0

Nur als Nebenbemerkung ist der Methodenname [HttpGet] _RemoveItem, während der Methodenname [HttpPost] _RemoveItems lautet. – nocturns2

Antwort

2

Sie können das [Authorize] Attribut in einer Zeile über Ihre Methode:

[Authorize] 
public ActionResult _RemoveItems() 

Dies erfordert, dass jeder, der auf diese Methode zugreift, angemeldet ist, Punkt.

Sie können dem Autorize-Attribut auch weitere Parameter hinzufügen, um zu verwalten, welche Rollen zulässig sind usw.

Wie in:

[Authorize(Roles="SpecialRole, OtherRole")] 

In diesem Fall ermöglicht das Verfahren nur Benutzer in den "SpecialRole Rolle und/oder die Rolle 'OtherRole', oder in beiden Rollen Zugriff hat.

+0

Habe versucht, [AUTORIZIZE] und das "irgendwie" zu arbeiten. Das Problem ist, dass es jetzt, sagt dies, wenn ich versuche zu löschen. http://i.imgur.com/xTsz9KI.png –

+0

@Code King, Ich habe Ihren ursprünglichen Beitrag über das, was möglicherweise die Ausnahme verursachen kann kommentiert. – nocturns2

+0

Alles klar ich habe es funktioniert, warum habe ich diesen Fehler? Ich weiß es nicht, ich habe alles gelöscht und wieder geschrieben, und dann hat es funktioniert! Platzieren Sie [Autorisieren], damit es funktioniert! Danke vielmals! Hab einen schönen Tag! –

0

Wenn Sie versuchen, die Löschtaste auf Ihrer Ansicht zu erhalten, zu verschwinden, Sie gehen einige zusätzliche Arbeit zu tun haben, um das zu erreichen:

In der Controller-Aktion, die Ihre Ansicht zeigt, Sie Irgendwie müssen sie passieren, wenn der Benutzer angemeldet ist oder nicht (Sie können dies aus Ihrer Sicht tun, aber Sie sollten nicht). Sie können dies einfach mit ViewBag tun oder Ihr Modell so modifizieren, dass es eine Eigenschaft enthält, ganz wie es Ihnen am besten passt.

[HttpGet] public void Index() { 
    ViewBag.IsLoggedIn = HttpContext.User.Identity.IsAuthenticated; 
} 

Ihrer Ansicht

@(ViewBag.IsLoggedIn == false ? "" : Html.ActionLink("Slet", "_RemoveItem", "Home", new { @id = item.Id }, new { @class = "btn btn-danger" })) 

Es scheint, wie Sie bereits sind dafür, dass sie in angemeldet sind, und ich habe diese Antwort, da das ist, was man sich wie auf Basis wanted schien auf [ mein potenzielles Missverständnis] Ihrer Kommentare.

+0

Aber dann könnte der Benutzer immer noch die URL eingeben, um zu entfernen, so dass es nicht wirklich sicher ist. Mit [AUTHORIZE] können Sie den Zugriff auf die Ressource/Controller-Aktion blockieren, wenn der Benutzer nicht authentifiziert ist. –

+0

Aber das ist es - er überprüft bereits, ob sie authentifiziert sind. Es sei denn, das Attribut "[Autorisieren]" und die Eigenschaft, die er im OP eincheckt, sollten verschiedene Dinge zurückgeben, von denen ich denke, dass sie nicht passieren sollten. –

+0

Nicht das, was ich suche, denn seit dem die Benutzer wie Florian erzählt. Kann einfach die URL schreiben :) –