31 Stimmen

ASP.NET MVC-Umleitung zu einer Seite mit verweigertem Zugriff unter Verwendung eines benutzerdefinierten Rollenanbieters

Ich erstelle einen benutzerdefinierten Rollenanbieter und ich setze ein Authorize-Attribut, das eine Rolle in meinem Controller angibt, und es funktioniert ganz gut, wie folgt:

[Authorize(Roles="SuperAdmin")]
public class SuperAdminController : Controller
...

Wenn ein Benutzer jedoch keinen Zugriff auf diesen Controller hat, wird er auf die Anmeldeseite umgeleitet. Wie kann ich ihn auf eine "AcessDenied.aspx"-Seite umleiten?

43voto

eu-ge-ne Punkte 27673
[AccessDeniedAuthorize(Roles="SuperAdmin")]
public class SuperAdminController : Controller

AccessDeniedAuthorizeAttribute.cs:

public class AccessDeniedAuthorizeAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        base.OnAuthorization(filterContext);

        if(filterContext.Result is HttpUnauthorizedResult)
        {
            filterContext.Result = new RedirectResult("~/AcessDenied.aspx");
        }
    }
}

27voto

Matt Frear Punkte 48503

Hier ist meine Lösung, basierend auf der Antwort von eu-ge-ne. Meine leitet den Benutzer korrekt auf die Anmeldeseite um, wenn er nicht angemeldet ist, aber auf die Seite "Zugriff verweigert", wenn er zwar angemeldet ist, aber nicht berechtigt ist, diese Seite anzuzeigen.

[AccessDeniedAuthorize(Roles="SuperAdmin")]
public class SuperAdminController : Controller

AccessDeniedAuthorizeAttribute.cs:

public class AccessDeniedAuthorizeAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        base.OnAuthorization(filterContext);
        if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
        {
            filterContext.Result = new RedirectResult("~/Account/Logon");
            return;
        }

        if (filterContext.Result is HttpUnauthorizedResult)
        {
            filterContext.Result = new RedirectResult("~/Account/Denied");
        }
    }
}

AccountController.cs:

public ActionResult Denied()
{
    return View();
}

Views/Account/Denied.cshtml: (Razor-Syntax)

@{
    ViewBag.Title = "Access Denied";
}

<h2>@ViewBag.Title</h2>

Sorry, but you don't have access to that page.

8voto

KP. Punkte 2088

Werfen Sie einen Blick auf tvanfosson 's Antwort de diese sehr ähnliche Frage Das ist es, was ich tue (Dank an tvanfosson), also muss ich jetzt nur noch sagen:

[MyAuthorize(Roles="SuperAdmin",ViewName="AccessDenied")]
public class SuperAdminController : Controller
...

Wenn der Benutzer nicht in der Rolle ist, erhält er die durch ViewName angegebene Ansicht.

6voto

Vic Alcazar Punkte 98

Eine leichte Verbesserung zu Matts Antwort, indem die Notwendigkeit vermieden wird, die Anmeldeseite hart zu kodieren und optional die Ansicht "Zugriff verweigert" innerhalb des Attributs zu setzen:

public class AccessDeniedAuthorizeAttribute : AuthorizeAttribute
{
    public string AccessDeniedViewName { get; set; }

    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        base.OnAuthorization(filterContext);

        if (filterContext.HttpContext.User.Identity.IsAuthenticated &&
            filterContext.Result is HttpUnauthorizedResult)
        {
            if (string.IsNullOrWhiteSpace(AccessDeniedViewName))
                AccessDeniedViewName = "~/Account/AccessDenied";

            filterContext.Result = new RedirectResult(AccessDeniedViewName);
        }
    }
}

6voto

gdbdable Punkte 4288

Umleitung ist nicht immer die beste Lösung

Verwenden Sie den standardmäßigen http-Code 403:

return new HttpStatusCodeResult(HttpStatusCode.Forbidden);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X