Question

J'ai un site ASP.NET MVC qui est verrouillé à l'aide de l'authentification par formulaires. Le web.config a

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

Aucune de mes pages autres que Account / LogOn ne peut être affichée à moins que l'utilisateur ne soit authentifié.

J'essaie maintenant d'ajouter un IPN PayPal à mon site. Pour ce faire, j'ai besoin de deux pages qui gèrent la confirmation de paiement de PayPal et la page de remerciement. Ces deux pages doivent être disponibles pour les utilisateurs anonymes.

Je voudrais que ces pages soient des actions du contrôleur de mon contrôleur de compte. Puis-je appliquer un attribut à des méthodes d'action spécifiques qui les rendent accessibles aux utilisateurs anonymes? J'ai trouvé plusieurs billets ici qui tentent de le faire, mais la plupart des gens voulaient le scénario opposé.

En gros, je souhaite que la classe AccountController ne dispose d'aucune autorisation pour la plupart des méthodes, à l'exception de quelques-unes. Pour le moment, il semble que seule la méthode LogOn soit disponible pour les utilisateurs anonymes.

Était-ce utile?

La solution

Oui, vous le pouvez. Dans votre AccountController, il existe un attribut [Authorize], au niveau de la classe (pour restreindre tout le contrôleur) ou à l'aide de méthodes spécifiques.

Pour restreindre certaines actions, vous utilisez simplement l'attribut Authorize sur les méthodes qui gèrent ces actions et laissez la classe de contrôleur non restreinte.

Voici quelques exemples ... espérons que cela vous aidera

Pour obliger les utilisateurs à se connecter, utilisez:

[Authorize]
public class SomeController : Controller

// Or
[Authorize]
public ActionResult SomeAction()

Pour restreindre l'accès à des rôles spécifiques, utilisez:

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

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

Et pour restreindre l'accès à des utilisateurs spécifiques, utilisez:

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

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

Comme vous pouvez le constater, vous pouvez utiliser l'attribut au niveau de la classe ou au niveau de la méthode. Votre choix!

Autres conseils

Je ne pense pas qu'il existe un " Unauthorize " attribut qui peut être appliqué aux actions et si vous ne souhaitez pas placer "Autoriser" " sur toutes les actions d’un contrôleur sauf deux, procédez comme suit:

Voici deux méthodes auxquelles je peux penser:

1- Attribut d'emplacement dans Web.config (Vous ne savez pas si cela fonctionnera avec le routage MVC, etc.)

Après votre

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

dans le fichier web.config, ajoutez les éléments suivants:

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

Où Compte / ActionOne est le nom de la méthode d'action à laquelle vous souhaitez accorder un accès anonyme. Pour la deuxième action, copiez le code ci-dessus, collez-le juste après et modifiez le nom de l'action.

Je ne sais pas si cela fonctionnera à cause du routage MVC, etc., mais essayez-le.

2- Contrôleur de base

Si la solution précédente ne fonctionnait pas, la meilleure solution serait de créer un contrôleur de base orné de l'attribut Authorize:

[Authorize]
public class AuthorizeControllerBase : Controller {}

Ensuite, tous vos contrôleurs en héritent:

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

Cela fera en sorte que tout contrôleur héritant de AuthorizeControllerBase nécessite une autorisation / une connexion pour appeler une méthode.

Ensuite, vous devez supprimer de votre web.config

.

Au lieu de sécuriser toutes les ressources de votre site Web par défaut et de rechercher ensuite un moyen de fournir un accès anonyme à des ressources individuelles, vous feriez probablement mieux d'adopter une approche opposée. Ne spécifiez pas de règles d'autorisation dans votre Web.config, puis utilisez des filtres d'autorisation (voir la réponse de Mickel) pour sécuriser des contrôleurs individuels et / ou des actions.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top