无法注销身份MVC 5应用程序

时间:2014-06-11 16:21:36

标签: c# asp.net-mvc asp.net-mvc-5 asp.net-identity identity

我正在创建一个新的(空模板)ASP.NET MVC 5应用程序,我无法注销此应用程序。 我的注销行动:

public ActionResult LogOff()
{
    if (User.Identity.IsAuthenticated)
    {
        //break here
    }
    try
    {
        AuthenticationManager.SignOut();
        if (User.Identity.IsAuthenticated || Request.IsAuthenticated)
        {
            //break here;
        }
    }
    return RedirectToAction("Login", "Account");
}

启动课程:

public partial class Startup
{
    public void ConfigureAuth(IAppBuilder app)
    {
        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            LoginPath = new PathString("/Account/Login")
        });
        app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
    }
}

应用程序上下文:

 public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
 {
    public ApplicationDbContext()
        : base("DefaultConnection", false)
    {
    }
 } 

连接字符串:

<connectionStrings>
<add name="DefaultConnection" connectionString="Server=.;Database=DataTest;Trusted_Connection=True;" providerName="System.Data.SqlClient" />
</connectionStrings>

操作LogOff()执行没有问题,并将我重定向到&#39;登录&#39;行动,但我仍然登录。 这有什么问题?

6 个答案:

答案 0 :(得分:4)

试试这个:

[HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult LogOff()
    {
        //AuthenticationManager.SignOut();
        AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie, DefaultAuthenticationTypes.ExternalCookie);
        Session.Abandon();
        return RedirectToAction("Login", "Account");
    }

答案 1 :(得分:2)

n

^^将 Startup.Auth.cs 中的“ LogoutPath ”设置为您想要的路径

答案 2 :(得分:1)

你的大多数代码对我来说都很好。我猜你的动作方法有问题。通常,这里唯一要做的就是

public ActionResult LogOff()
{
    AuthenticationManager.SignOut();

    return RedirectToAction("Login", "Account");
}

我不知道if-blocks对你的退出过程是否至关重要,但这个双线是你唯一需要做的事情。如果它至关重要,您应该通过调试器检查 SignOut 方法是否被命中。

答案 3 :(得分:0)

这对我有用: 在RouteConfig.cs中创建一个路径,如

 routes.MapRoute(
       "userlogout",
       "Account/Logout",
       new { controller = "Account", action = "LogOff" }
       );

您可以维护默认的注销代码 AccountController.cs或添加其他人建议的添加内容(如session.abandon();等) 但正如下面应该工作

[HttpPost] 
[ValidateAntiForgeryToken]
public ActionResult LogOff()
{
    AuthenticationManager.SignOut();

    return RedirectToAction("Login", "Account");
}

答案 4 :(得分:0)

在这种情况下,您还可以执行以下操作: 从LogOff操作中删除[HttpPost]并改为添加[HttpGet]。 您只需要传递AntiForgeryToken。但问题是,如果这是一种非常安全的方式。更多信息请点击此处:Using MVC3's AntiForgeryToken in HTTP GET to avoid Javascript CSRF vulnerability

[HttpGet] 
[ValidateAntiForgeryToken]
public ActionResult LogOff()
{
     AuthenticationManager.SignOut();
     return RedirectToAction("Login", "Account");
}

答案 5 :(得分:0)

关于ASP .Net MVC Logout无效: -

我遇到一个问题,即在生产模式下在IIS上托管的应用程序无法正常使用chrome

虽然它在所有浏览器中使用Visual Studio Dev托管时都正常工作 - 在IE上的生产模式下

我在Startup.Auth.CS中遇到了问题。确保重复配置不适用于以下内容

app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
app.UseCookieAuthentication((new CookieAuthenticationOptions(.....))