Me anula la clase para realizar la Autorización personalizado

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class AuthorizeAttribute : System.Web.Mvc.AuthorizeAttribute
{
    protected override void HandleUnauthorizedRequest(System.Web.Mvc.AuthorizationContext filterContext)
    {
        if (filterContext.HttpContext.Request.IsAuthenticated)
        {
            filterContext.Result = new System.Web.Mvc.HttpStatusCodeResult(403);
        }
        else
        {
            base.HandleUnauthorizedRequest(filterContext);
        }
    }
}

ahora en la web.config he configurado el error 403 página

<customErrors defaultRedirect="/Shared/Error" mode="On">
  <error statusCode="403" redirect="/Shared/UnAuthorize" />
</customErrors>

pero el navegador me muestra predeterminada de la página de error 403,
lo que me estoy perdiendo aquí, cualquier idea

OriginalEl autor Saboor Awan | 2011-08-11

6 Comentarios

  1. 11

    Sólo una pequeña sugerencia/nota además de Max B. respuesta:

    Cuando estoy utilizando errores personalizados puedo hacer una ErrorsController, y un Desautorizada ActionResult y hacer lo siguiente:

    <error statusCode="403" redirect="/Errors/UnAuthorize" />

    De esta forma, se puede añadir información adicional o hacer otras acciones en mi controlador, por ejemplo:

    • Como el registro a la base de datos que alguien ha intentado acceder a una autentica zona.
    • Error de conteo.
    • Tal vez un bug o formulario de informe que se pueden utilizar para enviar la información de administración.

    De esta manera usted tiene más control sobre lo que está sucediendo.

    en realidad, yo estoy haciendo lo mismo, Compartida es el controlador y no es de acción, pero todavía estoy recibiendo el mismo valor por defecto http 403 página de error, no es mi página definidos por el
    muy útil el enlace stackoverflow.com/questions/2504923/…
    He probado el mismo, pero sin suerte. El método de controlador no se llama nunca. ¿Puedes resolver el problema con esta respuesta o con el enlace que has publicado?

    OriginalEl autor Kevin Cloet

  2. 10

    Sé que esto es muy vieja pregunta, pero voy a postear para alguien que pueda tener el mismo problema. Como yo, yo tenía el mismo problema y solucionado. Si desea activar el elemento customErrors en la web.de configuración, usted puede tratar a continuación.

    protected override void HandleUnauthorizedRequest(System.Web.Mvc.AuthorizationContext filterContext)
    {
        throw new HttpException(403, "Forbidden");
    }
    Funciona a la perfección y más fácil que otras soluciones.
    ¿dónde poner esto? Sería bueno añadir. Puede ser un Área específica?
    Usted puede poner en su atributo personalizado de la clase. Y podrías elaborar más sobre la ‘Zona’?
    Mis 50 centavos, el uso del Sistema.Net.HttpStatusCode Enum para obtener los códigos de estado. Por ejemplo: (int)HttpStatusCode.Prohibido

    OriginalEl autor genki98

  3. 6

    Tuve exactamente el mismo problema que tenía cuando escribí mi propio personalizado AuthorizeAttribute. Los errores personalizados, página 403 no se muestran cuando he añadido «customErrors» etiqueta en la web.config.
    Esta es la forma en que lo tengo resuelto:

    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
    public class AuthorizeAttribute : System.Web.Mvc.AuthorizeAttribute
    {
        protected override void HandleUnauthorizedRequest(System.Web.Mvc.AuthorizationContext filterContext)
        {
            if (filterContext.HttpContext.Request.IsAuthenticated)
            {
               filterContext.Result = new RedirectToRouteResult(
                    new RouteValueDictionary(
                        new
                            { 
                                controller = "Error", 
                                action = "Unauthorised" 
                            })
                    ); 
    
            }
            else
            {
                base.HandleUnauthorizedRequest(filterContext);
            }
        }
    }

    Asignado una ruta que me gustaría mostrar a filterContext.Resultado, en lugar de asignar 403 HttpStatusCode.

    OriginalEl autor Amna Ali

  4. 3

    O usted puede hacer esta alternativa de solución,en lugar de usar :

    filterContext.Result = new System.Web.Mvc.HttpStatusCodeResult(403);

    usted puede cambiar a :

    if (filterContext.HttpContext.Request.IsAuthenticated)
            {               
                throw new UnauthorizedAccessException();
            }

    Y reemplazar el método OnException(ExceptionContext filterContext) en el Controlador/BaseController

    protected override void OnException(ExceptionContext filterContext)
        {
            if (filterContext.ExceptionHandled)
            {
                return;
            }
    
            if (filterContext.Exception.GetType() == typeof(UnauthorizedAccessException))
            {   
                filterContext.Result = new ViewResult
                {
                    ViewName = "~/Views/Error/NotAuthorized.cshtml"
                };
                filterContext.ExceptionHandled = true;
                return;
            }
    
            base.OnException(filterContext);
        }

    OriginalEl autor Rivera

  5. 0

    Cómo manejar 401 (no autorizado), 403 (Prohibido) y 500 (Error Interno del Servidor) en mvc. Para ajax/no-llamadas ajax y bajo aspx autenticación de formularios.

    Puede ser modificado para manejar varias uncaught excepciones de manera diferente y reaccionan de manera diferente si la solicitud es ajax o no. El auth parte le permite eludir cualquier regulares web mvc formas redirect-a-login-nombre de la página y en lugar de volver 401 no autorizado – su cliente-lado js marco puede reaccionar a un estado http 401/403 más fácilmente.

    //FilterConfig.cs:
    filters.Add(new ApplicationAuthorizeAttribute());
    filters.Add(new ApplicationHandleErrorAttribute());
    public class ApplicationAuthorizeAttribute : System.Web.Mvc.AuthorizeAttribute
    {
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
    //Note: To reach here, a Web.config path-specific rule 'allow users="?"' is needed (otherwise it redirects to login)
    var httpContext = filterContext.HttpContext;
    var request = httpContext.Request;
    var response = httpContext.Response;
    if (request.IsAjaxRequest())
    {
    response.SuppressFormsAuthenticationRedirect = true;
    response.TrySkipIisCustomErrors = true;
    }
    filterContext.Result = new HttpUnauthorizedResult();
    }
    }
    public class ApplicationHandleErrorAttribute : HandleErrorAttribute
    {
    public override void OnException(ExceptionContext context)
    {
    var exception = context.Exception is AggregateException
    ? ((AggregateException)context.Exception).InnerExceptions.First()
    : context.Exception;
    var request = context.HttpContext.Request;
    var response = context.HttpContext.Response;
    var isAjax = request.IsAjaxRequest();
    if (exception is MyCustomPermissionDeniedException)
    {
    filterContext.Result = new HttpStatusCodeResult(HttpStatusCode.Forbidden);
    response.TrySkipIisCustomErrors = isAjax;
    filterContext.ExceptionHandled = true;
    return;
    }
    #if DEBUG
    if (!isAjax)
    {
    //Show default aspx yellow error page for developers
    return;
    }
    #endif
    var requestUri = request.Url == null ? "" : request.Url.AbsoluteUri;
    MyCustomerLogger.Log(exception, requestUri);
    response.Clear();
    response.StatusCode = (int)System.Net.HttpStatusCode.InternalServerError;
    #if DEBUG
    var errorMessage = exception.Message;
    #else
    var errorMessage = "An error occurred, please try again or contact the administrator.";
    #endif
    response.Write(isAjax
    ? JsonConvert.SerializeObject(new {Message = errorMessage})
    : errorMessage);
    response.End();
    response.TrySkipIisCustomErrors = true;
    context.ExceptionHandled = true;
    }
    }

    Web.config:

    <system.webServer>
    <authentication mode="Forms">
    <forms name=".MYAUTHCOOKIE" protection="All" loginUrl="/Account/Login" timeout="18000" slidingExpiration="true" enableCrossAppRedirects="false" />
    </authentication>
    <authorization>
    <deny users="?" />
    </authorization>
    </system.webServer>
    <!-- ajax api security done via ApplicationAuthorizeAttribute -->
    <location path="api">
    <system.web>
    <authorization>
    <allow users="?"/>
    </authorization>
    </system.web>
    </location>

    Ruta adicional para el servicio web de solicitudes de api: (se pone por encima de regular mvc ruta)

    //This route has special ajax authentication handling (no redirect to login page)
    routes.MapRoute(
    name: "DefaultApi",
    url: "api/{controller}/{action}/{id}",
    defaults: new { id = UrlParameter.Optional }
    );

    Código de muestra del cliente para jquery para controlar el error:

    $.ajaxSetup({
    complete: function onRequestCompleted(xhr, textStatus) {
    if (xhr.readyState == 4 && xhr.status == 401) {
    //Not needed with smart status: && xhr.responseText.substring(0, 150).indexOf("<title>Log in") != -1
    //location.href = "/Account/Login";
    alert("Your session has timed out.");
    }
    }
    });

    Alternativamente, puedes hacer todas auth ir a través de ApplicationHandleErrorAttribute, y deshacerse de esa web.config deny users=»?». Pero tengo un legado página aspx que no golpea el mvc filtrado por eso quiero que deny users=»?».

    En realidad debería ser capaz de F12 (resharper descompilar? ms servidor de símbolos?) en: ControllerActionInvoker, HandleErrorAttribute, AuthorizeAttribute. Esto es muy esclarecedora la lectura. ControllerActionInvoker utiliza cada uno de los 4 filtros-tipos de forma diferente. (auth, acción, resultado, a excepción) por ejemplo, Ir a su controlador, golpear F12 en la base de la clase de «Controlador», F12 en «IAuthorizationFilter», Mayús + F12 en «OnAuthorization».

    OriginalEl autor Curtis Yallop

  6. -1

    A mí me parece que el de la HttpStatusCodeResult(403) está en el mal, si la rama. En mi opinión, el código debe tener este aspecto:

    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
    public class AuthorizeAttribute : System.Web.Mvc.AuthorizeAttribute
    {
    protected override void HandleUnauthorizedRequest(System.Web.Mvc.AuthorizationContext filterContext)
    {
    if (!filterContext.HttpContext.Request.IsAuthenticated)
    {
    base.HandleUnauthorizedRequest(filterContext);
    filterContext.Result = new System.Web.Mvc.HttpStatusCodeResult(403);
    }
    }
    }
    Es posible que desee probar que… que evita el requisito de la Autorización cuando Autenticado.

    OriginalEl autor hydr

Dejar respuesta

Please enter your comment!
Please enter your name here