Aus diesem Grund sollten Sie immer überprüfen, ob diese ID zu dem aktuell authentifizierten Benutzer gehört. Der aktuell authentifizierte Benutzer wird im Formularauthentifizierungs-Cookie gespeichert und kann vom Benutzer nicht geändert werden, da der Wert verschlüsselt ist. Dieser Cookie wird ausgegeben, wenn sich der Benutzer anmeldet und Sie können überall darauf zugreifen, wo Sie eine Instanz zu HttpContextBase
haben (die fast überall in den V- und C-Teilen des MVC-Musters ist).
Zum Beispiel wie folgt aus:
[Authorize]
public ActionResult Foo(int id)
{
string currentUser = httpContext.User.Identity.Name;
// TODO: go ahead and check in your backed that the id
// belongs to the currently connected user
...
}
Offensichtlich diese Kontrollen immer und immer wieder in allen Controller-Aktionen zu schreiben schnell langweilig werden könnte, nicht die Trockenheit des Ansatzes zu erwähnen. Daher wird empfohlen, ein benutzerdefiniertes Autorisierungsattribut zu schreiben, das diese Prüfungen durchführt, bevor die Controlleraktion ausgeführt wird. Dann werden Sie Ihre Controller-Aktionen mit diesem benutzerdefinierten Attribut dekorieren und Sie werden sicher wissen, dass wenn der Code innerhalb der Aktion erreicht hat, dass der aktuelle Benutzer der Besitzer der als Parameter übergebenen ID ist. Die Art, wie diese ID als Parameter übergeben wird, spielt keine Rolle. Könnte Routendaten, Abfragezeichenfolge, POST, was auch immer sein. Der Benutzer kann es beliebig ändern. Wichtig ist, dass Sie sicherstellen, dass der von Ihnen eingegebene Wert mit Ihrer Domänenautorisierungslogik übereinstimmt.
So:
public class AuthorizeOwnerAttribute : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
var authorized = base.AuthorizeCore(httpContext);
if (!authorized)
{
// the user is either not authenticated or not authorized
// no need to continue any further
return false;
}
// at this stage we know that the user is authenticated and
// authorized (in roles), so let's go ahead and see who this
// user is
string username = httpContext.User.Identity.Name;
// now let's read the id. In this example I fetch it from
// the route data but you could adapt according to your needs
string id = httpContext.Request.RequestContext.RouteData.Values["id"] as string;
// Now that we know the user and the id let's go ahead and
// check in our backend if the user is really the owner
// of this id:
return IsOwner(username, id);
}
private bool IsOwner(string username, string id)
{
// go ahead and hit the backend
throw new NotImplementedException();
}
}
und dann:
[AuthorizeOwner]
public ActionResult Foo(int id)
{
...
}
Hallo Darin, Danke für die schnelle Antwort. – user1079925
Gibt es irgendwelche guten Bücher/Websites, um dies zu lesen, da ich ein absoluter Neuling zu diesem Thema bin? – user1079925
@ user1079925, Ich habe kein einziges Buch gelesen, kann Ihnen also wirklich nichts empfehlen. Es tut uns leid. Ich höre positives Feedback zum 'Pro ASP.NET MVC 3 Framework', kann Ihnen aber keinen persönlichen Überblick geben. Aber wenn Sie Anfänger in ASP.NET MVC sind, würde ich Ihnen empfehlen, hier zu starten: http://asp.net/mvc –