web-dev-qa-db-fra.com

MVC AuthenticationManager.SignOut () ne se déconnecte pas

Mon projet est basé sur le modèle de projet MVC 5 de Visual Studio 2013 (option de compte d'utilisateur individuel). Je me suis appuyé sur la méthode par défaut de connexion et de déconnexion pour mes utilisateurs. Mais je ne suis pas sûr de ce que j'ai fait, à un moment donné, les utilisateurs ne peuvent plus se déconnecter, mais ils peuvent se connecter en tant qu'autre utilisateur.

C'est la méthode de fermeture de session par défaut de Account Controller

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult LogOff()
    {
        AuthenticationManager.SignOut();
        return RedirectToAction("Index", "Home");
    }
    private IAuthenticationManager AuthenticationManager
    {
        get
        {
            return HttpContext.GetOwinContext().Authentication;
        }
    }

Il s'agit de la vue _LoginPartial.cshtml par défaut qui indique le nom d'utilisateur de l'utilisateur.

    @using Microsoft.AspNet.Identity
    @if (Request.IsAuthenticated)
    {
        using (Html.BeginForm("LogOff", "Account", FormMethod.Post, new { id = "logoutForm", @class = "navbar-right" }))
        {
            @Html.AntiForgeryToken()

            <ul class="nav navbar-nav navbar-right">
                <li>
                    @Html.ActionLink("Hello " + User.Identity.GetUserName() + "!", "Index", "Manage", routeValues: null, htmlAttributes: new { title = "Manage" })
                </li>
                <li><a    href="javascript:document.getElementById('logoutForm').submit()">Log off</a>            </li>
            </ul>
        }
    }
    else
    {
        <ul class="nav navbar-nav navbar-right">
            <li>@Html.ActionLink("Register", "Register", "Account", routeValues: null, htmlAttributes: new { id = "registerLink" })</li>
            <li>@Html.ActionLink("Log in", "Login", "Account", routeValues: null, htmlAttributes: new { id = "loginLink" })</li>
        </ul>
    }

Lorsque l'utilisateur se déconnecte, l'utilisateur est dirigé vers la page de connexion, mais son nom d'utilisateur est toujours affiché, ce qui signifie qu'il ne s'est pas déconnecté. Et l'URL du navigateur indique http: // localhost/Account/Login? ReturnUrl =% 2FAccount% 2FLogOff

Cela ne ramène pas l'utilisateur à la page d'index de la page d'accueil. Donc, je suppose que quelque chose s'est passé à l'instruction AuthenticationManager.SignOut () ;. Je suis confus parce que je n'ai rien changé au contrôleur de compte.

Toute avance serait grandement appréciée.

10
Ramesisiii

J'ai eu le même problème. Cochez cette question sur CodePlex:

http://web.archive.org/web/20160403071605/https://aspnetidentity.codeplex.com/workitem/2347

Essayez de remplacer AuthenticationManager.SignOut() par AuthenticationManager.Signout(DefaultAuthenticationTypes.ApplicationCookie);

J'espère que je vous aide. :-)

8
Sergio Gonçalves

Ajoutez simplement cette ligne de code après SignOut ():

 HttpContext.User = new GenericPrincipal(new GenericIdentity(string.Empty), null);

Vérifiez également ceci: Page.User.Identity.IsAuthenticated toujours vrai après FormsAuthentication.SignOut ()

3
Ice2burn

J'ai pensé que mon problème n'était pas à SignOut(). Si vous pensez que votre problème est à SignOut() (et en utilisant l'authentification Owin), consultez le lien de Sergio

Pour mon cas, c'est une erreur stupide! J'ai oublié que j'ai ajouté [Authorize(Role = "admins")] au contrôleur, parce que je voulais seulement que les administrateurs utilisent la méthode de registre fournie avec le modèle par défaut. Et le résultat est que personne, à l'exception des administrateurs, ne peut se déconnecter!

Voici ce que j'ai eu:

[Authorize(Roles = "admin")]
public class AccountController : Controller
{
    public ActionResult LogOff()
    {
    }
    public ActionResult Register()
    {
    }
}

Ce que j'ai fait est de déplacer les méthodes du registre vers un nouveau contrôleur, comme ci-dessous:

[Authorize]
public class AccountController : Controller
{
    public ActionResult LogOff()
    {
    }
}

et

[Authorize(Roles = "admin")]
public class AdminController : Controller
{
    public ActionResult Register()
    {
    }
}

Maintenant, tout le monde peut se déconnecter et seuls les administrateurs peuvent enregistrer des utilisateurs. (Et le AuthenticationManager.SignOut() par défaut fonctionne bien.)

2
Ramesisiii

Remplacer 

AuthenticationManager.Signout(); 

avec 

AuthenticationManager.Signout(DefaultAuthenticationTypes.ApplicationCookie); 

selon le numéro dans la réponse de Sergio

2
stuartdotnet

J'ai fait face au même problème ..

Ci-dessous, une procédure standard log.ff ASP.Net MVC présentée par Microsoft et elle fonctionne, sauf que l'utilisateur, après la fermeture de session et la connexion, se trompera, car il s'agit d'un jeton d'authentification. Et dès que vous publierez, il est simple de le modifier. Mais personne ne dit à ce sujet.

// POST: /Account/LogOff
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult LogOff()
{
    AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);

    return RedirectToAction("Index", "Home");
}

Comme vous pouvez le constater, la méthode standard de fermeture de session dans AccountController

Que le code html, avec mon petit bidouillage -> id = "logoffbtn" 

 @using (Html.BeginForm("LogOff", "Account"))
 {
 @Html.AntiForgeryToken()
  <button class="btn btn-default btn-flat" id="logoffbtn" 
  type="submit">Logout</button>
 }

Donc, la solution pour se déconnecter correctement en utilisant la méthode standard consiste à ajouter quelque part dans votre fichier de script Java principal: 

$(document).ready(function()
{
    try
    {
        $('#logoffbtn').click(function ()
        {
            // alert('Sign new href executed.');
            console.log("Session token start");
            sessionStorage.removeItem('accessToken');
            console.log("Session token done");
        });
    } catch (e)
    {
        console.log("Session token err");
    }
});

Alors, que se passera-t-il ensuite ... après avoir appuyé sur le bouton de fermeture de session, vous effacerez l'accès au jeton et maintenant, la fermeture de session commencera à fonctionner normalement.

J'espère que cela pourra aider. 

P.S. J'ai essayé vraiment beaucoup de manières et seulement c'était un hack pour moi.

0
Jevgenij Kononov