J'ai créé un tout nouveau projet ASP.NET MVC 5 pour tester le [Authorize]
attribut avec FormsAuthentication.SetAuthCookie
. Je mets simplement un cookie en une seule action (dans mon contrôleur domestique):
public ActionResult About()
{
FormsAuthentication.SetAuthCookie("someUser", false);
Et je limite l'accès à un autre:
[Authorize]
public ActionResult Contact()
{
Lorsque je lance ma page Web et accède à /home/contact
, Je suis correctement redirigé vers une page de connexion. Ensuite, je vais à /home/about
, récupère mon cookie et retourne à la page de contact. Mais je suis toujours redirigé vers la page de connexion - le cookie ne m'authentifie pas/ne m'autorise pas.
Dans le débogueur, HttpContext.User.Identity.IsAuthenticated == false
lorsque je charge plusieurs fois la page À propos (c'est-à-dire qu'elle ne me voit jamais comme étant authentifiée même après avoir défini un cookie d'authentification).
Y a-t-il une étape supplémentaire à faire ici? Je ne devrais pas avoir besoin de définir mon propre IPrincipal pour l'authentification de base, le devrais-je?
de web.config supprimer:
<modules>
<!--<remove name="FormsAuthenticationModule" />-->
</modules>
ou simples supprimez la ligne dans web.config
EDIT: Je ne savais pas que MVC5 avait par défaut de nouveaux projets pour que l'authentification par formulaire soit supprimée (le module est supprimé), alors assurez-vous de vérifier également le commentaire de DSR sous votre post d'origine en conjonction avec tout cela.
Vérifiez votre web.config et recherchez la section d'authentification, elle devrait ressembler à ceci,
<authentication mode="Forms">
<forms loginUrl="..." cookieless="UseCookies" />
</authentication>
http://msdn.Microsoft.com/en-us/library/1d3t3c61%28v=vs.85%29.aspx
La valeur sans cookies par défaut est "UseDeviceProfile", ce qui signifie que les cookies sont utilisés si le navigateur signale qu'ils prennent en charge les cookies, sinon les cookies ne sont pas utilisés et il utilise des valeurs dans la chaîne de requête pour maintenir un état authentifié (qui doit être conservé entre les publications).
Deuxièmement, assurez-vous que les cookies sont activés dans votre navigateur. Si l'appareil/le navigateur ne prend pas en charge les cookies ou s'ils sont désactivés, SetAuthCookie apportera des modifications à l'URL, mais vous devez rediriger le navigateur après l'appel à SetAuthCookie en utilisant ...
FormsAuthentication.RedirectFromLoginPage(String, Boolean)...
Cette méthode redirige la page vers sa destination après l'authentification avec SetAuthCookie. RedirectFromLoginPage mettra les attributs requis dans la requête url pour maintenir la session de connexion entre les publications. Si vous effectuez vos propres redirections sur le site ici et là, vous devrez conserver ce paramètre de requête URL entre les publications vous-même en vérifiant si l'utilisateur actuel est authentifié avec HttpContext.Current.User.Identity.IsAuthenticated.
Pour envoyer vos utilisateurs à la page de connexion, vous devez utiliser
FormsAuthentication.RedirectToLoginPage()
Cette méthode ajoutera un paramètre returnUrl à la chaîne de requête, vers laquelle la fonction ultérieure "RedirectFromLoginPage" sera redirigée après avoir été authentifiée.
Si vous bloquez l'accès aux utilisateurs ou aux rôles avec des éléments d'emplacement dans votre web.config aux chemins et aux ressources, l'authentification par formulaire gère automatiquement la redirection vers la page de connexion lorsqu'un utilisateur non authentifié tente d'y accéder.
<location path="SomeFolderOnYourSite">
<system.web>
<authorization>
<deny users="?"/>
<allow roles="Administrators"/>
</authorization>
</system.web>
</location>
La spécification d'une valeur incorrecte pour l'attribut domain
de la balise forms peut également provoquer cela.
<authentication mode="Forms">
<forms domain="localhost" ... />
</authentication>
<location path="SomeFolderOnYourSite">
<system.web>
<authorization>
<deny users="?"/>
<allow roles="Administrators"/>
</authorization>
</system.web>
c'est comme si ça ne fonctionnait pas pour moi quand j'utilise le même code avec un petit changement ça fonctionne **<location path="~/SomeFolderOnYourSite"> <system.web> <authorization> <deny users="?"/> <allow roles="Administrators"/> </authorization> </system.web> </location>**