Prüfen Sie MVC-Controller-Berechtigung und die Rückkehr 401 Unauthorized zu angularJS app

Ich habe eine angularJS-Anwendung die Kommunikation mit der MVC-Controller, um einige Daten.

Ich habe implementiert eine Klasse RBACAuthorizeAttribute was erbt von AuthorizeAttribute zu überprüfen, ob der Benutzer die Berechtigung zum ausführen der Aktion auf dem controller. Die Implementierung dieser Klasse ist im folgenden dargestellt:

public class RBACAuthorizeAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        var controllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;
        var webAction = filterContext.ActionDescriptor.ActionName;
        var user = filterContext.HttpContext.User.Identity.Name;


        if (!HasPermission(controllerName, webAction, user))
        {
            filterContext.Result = new RedirectToRouteResult(
                                           new RouteValueDictionary {
                                            { "action", "Index" },
                                            { "controller", "Unauthorized" } });
        }            
    }

    private bool HasPermission(string controllerName, string webAction, string user)
    {
        //Check if the user has permission here.
        //return true or false.
        return false; 
    }
}

Den eigentlichen controller auf die ich bin der überprüfung der Berechtigung ist gegeben, unten:

public class MyDataController : Controller
{
    [Route("IndividualDetails/{id}")]
    [RBACAuthorize]
    public JsonResult GetIndividualDetails(string id)
    {
        var data = GetDataFromSomeTableInDatabase(id);

        return data;
    }

UnauthorizedController Klassendefinition ist:

public class UnauthorizedController : Controller
{
    public ActionResult Index()
    {
        return new HttpStatusCodeResult(HttpStatusCode.Unauthorized);
    }
} 

Unten ist die AngularJS-Funktion, die ruft der controller:

function getDetails(id) {
        return $resource(remoteServiceUrl + '/MyData/IndividualDetails/:id', { id: id })
            .get().$promise;
    };  

function loadUserDetails(id) {
    getDetails(id).then(
        function (result) {
            console.log(result);
        }, 
        function (reason) {
            console.log(reason);
        }
    );
}

Ich nehme an, dass die 401-Unauthorized Reaktion in der oben loadUserDetails Funktion, aber ich bin immer ziemlich große Auswahl in result enthält einige html-Seite. Das Problem scheint in der Umsetzung von RBACAuthorizeAttribute Klasse. So bekommen die 401-Unauthorized Fehler auf der client-Seite, kann jemand mir die richtige Richtung bitte.

Bearbeiten:
Ich bin mit Asp.Net Identitäts-system und die version von Asp.NET 5.

  • Sind Sie die Formularauthentifizierung verwenden? Auch die version von ASP.NET?
InformationsquelleAutor A J Qarshi | 2016-01-08



2 Replies
  1. 2

    Ich nehme an, dass die 401-nicht autorisiert-Antwort in den oben
    loadUserDetails Funktion, aber ich bin immer ziemlich große Auswahl in Folge
    mit einigen html-Seite

    Ich nehme an, dass diese HTML-Seite ist die login-Seite. Man könnte hinzufügen, einen benutzerdefinierten Schlüssel an, auf die HttpContext:

    public class UnauthorizedController : Controller
    {
        public ActionResult Index()
        {
            this.HttpContext.Items["SuppressAuthenticationKey"] = true;
            return new HttpStatusCodeResult(HttpStatusCode.Unauthorized);
        }
    }

    und dann in Ihr Global.asax abonnieren Sie die EndRequest Methode und vermeiden den Umleitung wenn dieser Schlüssel vorhanden ist:

    protected void Application_EndRequest(object sender, EventArgs e)
    {
        var context = (HttpApplication)sender;
        var response = context.Response;
    
        if (context.Context.Items.Contains("SuppressAuthenticationKey"))
        {
            response.TrySkipIisCustomErrors = true;
            response.ClearContent();
            response.StatusCode = 401;
            response.RedirectLocation = null;
        }
    }

    Wenn Sie die Formularauthentifizierung verwenden und .NET 4.5 oder höher Sie können die SuppressFormsAuthenticationRedirect – Eigenschaft auf true in Ihrem Unerlaubter Handlung.

    Außerdem sehe ich es irgendwie überflüssig, eine zusätzliche Umleitung zu Ihrer Unauthorized Aktion. Könnte man direkt zurück 401 von Ihrem benutzerdefinierten RBACAuthorizeAttribute:

    filterContext.Result = new HttpStatusCodeResult(HttpStatusCode.Unauthorized);
    • Das ist die Antwort. Vielen Dank für Ihre prompte Antwort.
    • Es wird funktionieren, aber es ist nicht die standard-Lösung für eine Anwendung, die mit ASP.NET Identität.
  2. 0

    Habe ich in dieser Sache sehr. Wenn Sie wieder die 401 die ASP.NET Infrastruktur umleiten Sie auf die login-Seite. Wenn Sie untersuchen, werden die bytes, die kommen wieder aus Ihren Anruf ich wäre bereit zu Wetten, dass es entweder Ihre login-Seite oder eine Fehlerseite (wenn Sie nicht über eine login-Seite definiert).

    Um dieses Problem zu lösen, müssen Sie ändern Sie die Provider für Ihre CookieAuthenticationOptions und setzen Sie Ihre eigene ‚OnApplyRedirect‘ – Methode, um nur die Umleitung auf eine 401-wenn es nicht ein AJAX-request.

    Irgendwo in der startup-code haben Sie so etwas wie:

    var options = new CookieAuthenticationOptions
    {
        LoginPath = new PathString(loginPath),
        CookieSecure = CookieSecureOption.Always,
        CookieName = cookieName,
    
        Provider = new CookieAuthenticationProvider()
        {
            OnApplyRedirect = context =>
            {
                if (!context.Request.IsAjaxRequest())
                { context.Response.Redirect(context.RedirectUri); }
            }
        }
    };
    
    app.UseCookieAuthentication(options);

    Den Variablen loginPath und cookieName enthalten sollte, den Pfad zur login-Seite/Aktion und dem cookie-Namen Ihrer site verwendet werden (z.B. „/Auth“ und „.MySiteAuthCookie“).

    Eigentlich hatte ich die Antwort in folgendem blog-post und Zwickte es ein bisschen für unsere Umwelt.

    http://brockallen.com/2013/10/27/using-cookie-authentication-middleware-with-web-api-and-401-response-codes

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.