Ich habe gerade eine benutzerdefinierte Autorisierungsmethode erstellt, damit ein Benutzer auf der von mir erstellten Website nur seine Ansicht sehen kann.

public class UserAuthorize : AuthorizeAttribute
{
    public string Username { get; set; }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        var authorized = base.AuthorizeCore(httpContext);
        if (!authorized)
        {
            return false;
        }

        string username = httpContext.User.Identity.Name;

        if(new RolesBL().IsUserInRole(username, 1))//1 is Admin
        {
            return true;
        }

        return Username.Equals(username);
    }
}

Ich habe Probleme, die Daten vom Controller an diese Methode weiterzuleiten.

[UserAuthorize(Username = username)]
public ActionResult Details(string username)
{
    User u = new UsersBL().GetUser(username);
    return View(u);
}

Wie kann ich den Benutzernamen im Parameter der Ansicht auch an die Authorize-Methode übergeben?
Danke und Grüße

0
Adrian Vella 31 Dez. 2015 im 14:30

2 Antworten

Beste Antwort

Die Argumente in einer [Attribute] -Deklaration werden alle zur Kompilierungszeit definiert und müssen daher Konstanten sein. Sie können den Laufzeitwert eines Aktionsparameters nicht "übergeben".

Außerdem wird das Attribut vor dem Aufrufen der Aktionsmethode verwendet (um zu bestimmen, ob die Aktion aufgerufen werden kann ), sodass dieser Parameter nicht einmal instanziiert wird.

Möglicherweise können Sie jedoch auf den Wert username innerhalb der Attributimplementierung UserAuthorize zugreifen, da Sie mit dem Parameter httpContext auf die Anforderungsdetails zugreifen können, die vermutlich den Benutzernamen als Teil von enthalten Abfragezeichenfolge.

0
Gary McGill 31 Dez. 2015 im 11:41

Dies ist kein Fall, in dem die Verwendung einer Autorisierung sinnvoll ist. Sie sollten stattdessen verhindern, dass der Benutzer ein Argument übergeben kann, um den Benutzer zu überschreiben, als den er angemeldet ist.

public ActionResult Details()
{
    User u = new UsersBL().GetUser(this.User.Identity.Name);
    return View(u);
}

Ihre Abfrage fungiert dann als Filter, um sicherzustellen, dass nur die angemeldeten Benutzerinformationen angezeigt werden.

Wenn Sie einen Superuser benötigen, um jeden Benutzer anzeigen / bearbeiten zu können, müssen Sie eine Rolle verwenden, um sicherzustellen, dass nur Benutzer in dieser Rolle andere Benutzer bearbeiten können. In diesem Fall reicht jedoch der Standard AuthorizeAttribute aus.

public ActionResult Details()
{
    User u = new UsersBL().GetUser(this.User.Identity.Name);
    return View(u);
}

[Authorize(Roles = "SuperUser")]
public ActionResult Details(string username)
{
    User u = new UsersBL().GetUser(username);
    return View(u);
}
1
NightOwl888 31 Dez. 2015 im 15:28