Pregunta

Tengo un sitio ASP.NET MVC que está bloqueado mediante la autenticación de formularios. El web.config tiene

<authentication mode="Forms">
    <forms defaultUrl="~/Account/LogOn" loginUrl="~/Account/LogOn" timeout="2880"/>
</authentication>
<authorization>
    <deny users="?"/>
</authorization>

Ninguna de mis páginas que no sean Account / LogOn se puede ver a menos que el usuario esté autenticado.

Ahora estoy tratando de agregar IPN de PayPal a mi sitio y para hacerlo necesito tener dos páginas que manejen la confirmación de pago de PayPal y la página de agradecimiento. Estas dos páginas deben estar disponibles para usuarios anónimos.

Me gustaría que estas páginas fueran acciones del controlador fuera del controlador de mi cuenta. ¿Hay alguna forma de aplicar un atributo a métodos de acción específicos que los pongan a disposición de usuarios anónimos? Encontré varias publicaciones aquí que intentan hacer eso, pero había mucha gente que quería el escenario opuesto.

Básicamente quiero que la clase AccountController no tenga autorización para la mayoría de los métodos, excepto algunos. En este momento, parece que solo el método LogOn está disponible para usuarios anónimos.

¿Fue útil?

Solución

Sí puedes. En su AccountController hay un atributo [Autorizar] en el nivel de clase (para restringir todo el controlador) o en métodos específicos.

Para restringir acciones específicas, simplemente use el atributo Authorize en los métodos que manejan estas acciones y deje la clase de controlador sin restricciones.

Aquí hay algunos ejemplos ... espero que ayude

Para solicitar que los usuarios inicien sesión, use:

[Authorize]
public class SomeController : Controller

// Or
[Authorize]
public ActionResult SomeAction()

Para restringir el acceso a roles específicos, use:

[Authorize(Roles = "Admin, User")]
public class SomeController : Controller

// Or
[Authorize(Roles = "Admin, User")]
public ActionResult SomeAction()

Y para restringir el acceso a usuarios específicos, use:

[Authorize(Users = "Charles, Linus")]
public class SomeController : Controller

// Or
[Authorize(Users = "Charles, Linus")]
public ActionResult SomeAction()

Como puede ver, puede usar el atributo a nivel de clase o a nivel de método. ¡Tu elección!

Otros consejos

No creo que haya un " Desautorizar " atributo que se puede aplicar a las acciones y si no desea colocar " [Autorizar] " en todas menos dos acciones en un controlador, intente lo siguiente:

Aquí hay dos métodos en los que puedo pensar:

1- Atributo de ubicación en Web.config (No estoy seguro de si esto funcionará con el enrutamiento MVC, etc.)

Después de tu

<system.web> stuff </system.web>

en el archivo web.config, agregue lo siguiente:

  <location path="Account/ActionOne">
     <system.web>
           <authorization>
              <allow users ="*" />
          </authorization>
      </system.web>
  </location>

Donde Account / ActionOne es el nombre del método de acción al que desea otorgar acceso anónimo. Para la segunda Acción, copie el código anterior y péguelo justo después y cambie el nombre de la Acción.

No estoy seguro de si esto funcionará debido al enrutamiento MVC, etc., pero inténtelo.

2- Controlador base

Si la solución anterior no funcionó, su mejor opción sería crear un controlador base que esté decorado con el atributo Autorizar:

[Authorize]
public class AuthorizeControllerBase : Controller {}

Luego haga que todos sus controladores hereden de él:

public class AccountController : AuthorizeControllerBase
{
      // your actions etc.
}

Esto hará que cualquier controlador que herede de AuthorizeControllerBase requiera autorización / inicio de sesión para invocar cualquier método.

Entonces deberías eliminarlo de tu web.config

En lugar de asegurar todos los recursos en su sitio web de forma predeterminada y luego buscar una forma de proporcionar acceso anónimo a los recursos individuales, probablemente sea mejor que adopte el enfoque opuesto. No especifique reglas de autorización en su web.config, luego use filtros de Autorización (vea la respuesta de Mickel) para asegurar controladores y / o acciones individuales.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top