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?

1voto

Cynninge Punkte 11

Ich hatte ein ähnliches Problem. Egal, welche Rolle ich hatte, ich wurde immer auf die LogIn-Seite statt auf AccessDenied umgeleitet. Die Lösung war unglaublich einfach, aber sie funktioniert vielleicht nicht in allen Fällen. Es stellte sich heraus, dass die Reihenfolge dieser beiden Zeilen in Startup.cs falsch war:

app.UseAuthentication();
app.UseAuthorization();

Stellen Sie sicher, dass wenn app.UseAuthentication(); ist BEVOR app.UseAuthorization();

Mit anderen Worten: Fragen Sie zuerst "Wer sind Sie?" und dann "Dürfen Sie hier sein?", nicht umgekehrt.

0voto

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

            if (filterContext.Result is HttpUnauthorizedResult && WebSecurity.IsAuthenticated)
            {
                filterContext.Result = new RedirectResult("~/Account/AccessDenied");
            }
        }
    }

0voto

Farinha Punkte 16906

Ich habe auf Vics Antwort aufgebaut, damit ich für jeden Bereich der Anwendung eine andere Seite "Zugriff verweigert" haben kann. Dies geschah durch die Rückgabe einer RedirectToRouteResult stattdessen auf eine URL relativ zum Root der Anwendung umleitet, leitet sie zum Controller und zur Aktion des aktuellen Bereichs um:

public class AccessDeniedAuthorizeAttribute : AuthorizeAttribute
{
    public string AccessDeniedController { get; set; }
    public string AccessDeniedAction { get; set; }

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

        if (filterContext.HttpContext.User.Identity.IsAuthenticated &&
            filterContext.Result is HttpUnauthorizedResult)
        {
            if (String.IsNullOrWhiteSpace(AccessDeniedController) || String.IsNullOrWhiteSpace(AccessDeniedAction))
            {
                AccessDeniedController = "Home";
                AccessDeniedAction = "AccessDenied";
            }

            filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { Controller = AccessDeniedController, Action = AccessDeniedAction }));
        }
    }
}

0voto

True Solutions Punkte 137

Nur ein kleines Update zu Vic Alcazar, Details der Anfrage-URL im Redirect hinzugefügt Damit können die Details des verweigerten Zugriffs protokolliert werden und von wem, wenn gewünscht

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";

            var requestUrl = filterContext.HttpContext.Request.Url;

            filterContext.Result = new RedirectResult(String.Format("{0}?RequestUrl={1}", AccessDeniedViewName, requestUrl));
        }
    }
}

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