OWIN - Authentication.SignOut()似乎不会删除cookie

时间:2015-03-11 23:27:53

标签: authentication cookies model-view-controller owin

我在使用OWIN Cookie身份验证时遇到了一些问题。我有一个.Net站点,它有一些MVC页面,它使用cookie认证和受承载令牌保护的WebAPI资源。

当我退出时,我删除了客户端上的访问令牌,因此后续API请求将不会在标头中包含令牌,因此将无法通过身份验证。这部分很好。

以同样的方式,我还希望注销以删除MVC页面使用的cookie。我在服务器上执行了以下操作:

    [Route("Logout")]
    public IHttpActionResult Logout()
    {
        var ctx = Request.GetOwinContext();
        var authenticationManager = ctx.Authentication;
        authenticationManager.SignOut();
        return Ok();
    }

然而,在调用Logout之后,我仍然可以访问受保护的MVC页面,即使这个cookie本应被Logout调用删除了。

看起来很简单,所以我可能错过了一些东西。

谢谢,

8 个答案:

答案 0 :(得分:42)

过去几天我遇到了类似的问题。而不是

Request.GetOwinContext().Authentication.authenticationManager.SignOut();

使用其中一个(且仅一个):

Request.GetOwinContext().Authentication.SignOut();

Request.GetOwinContext().Authentication.SignOut(Microsoft.AspNet.Identity.DefaultAuthenticationTypes.ApplicationCookie);

HttpContext.Current.GetOwinContext().Authentication.SignOut(Microsoft.AspNet.Identity.DefaultAuthenticationTypes.ApplicationCookie);

本文解释了为什么您的Cookie不会被删除:http://dotnet.dzone.com/articles/catching-systemwebowin-cookie

我知道我的答案不是最基于研究的,但说实话,我找不到为什么我提供的代码示例对我有用。我只知道如果你以另一种方式使用SignOut(),System.Web会弄乱Owins cookie。

答案 1 :(得分:2)

这对我有用。如果要使cookie无效,请将其丢入控制器。特别是,我使用它来更新用户的角色,以便用户不必手动注销并重新登录以修复在@if(User.IsInRole("Admin")){...}下加载的菜单。我希望这对某人有所帮助 - 我花了一段时间来解决这个问题。

    var updatedUser = await UserManager.FindByNameAsync(User.Identity.Name);
    var newIdentity = await updatedUser.GenerateUserIdentityAsync(UserManager);
    AuthenticationManager.SignOut();
    AuthenticationManager.SignIn(newIdentity);

答案 2 :(得分:0)

我遵循了上述所有解决方案,但最后我感到困惑,因为用户没有注销。最后我的问题解决了:

Request.GetOwinContext().Authentication.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
FederatedAuthentication.SessionAuthenticationModule.SignOut();

因为我使用SessionAuthenticationModule来保留其中的声明,因此在注销后,用户可以使用app,因为Cookie中存在现有的FedAut。

答案 3 :(得分:0)

<div class="grid-two imageandtext">

  <div class="imageandtext image_grid">
    <label>
      <img src="http://yaitisme.com/images/getImage.jpg" class="img-thumbnail">
      <input type="radio" name="selimg">
      <span class="caption">
        <span>Painting</span>
      </span>
    </label>
  </div>

  <div class="imageandtext image_grid">
    <label>
      <img src="http://yaitisme.com/images/getImage.jpg" class="img-thumbnail">
      <input type="radio" name="selimg">
      <span class="caption">
        <span>Painting</span>
      </span>
    </label>
  </div>

</div>

答案 4 :(得分:0)

关于ASP .Net MVC Logout无效: -

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

尽管它正常运作 - 在所有浏览器中使用Visual Studio Dev托管 - 在IE上的生产模式

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

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

答案 5 :(得分:0)

过去几天,我在一些Microsoft Azure示例中遇到了类似的问题。 解决方法:

    public IHttpActionResult Index()
    {
        HttpContext.Current.GetOwinContext().Authentication.SignOut(
            CookieAuthenticationDefaults.AuthenticationType, 
            OpenIdConnectAuthenticationDefaults.AuthenticationType);
        return Ok();
    }

答案 6 :(得分:0)

这是最终对我有用的方法。我也解释了我的答案。

https://stackoverflow.com/a/65600575/5360237

答案 7 :(得分:-1)

我让这个工作。这是我做的:

当我调用上面的Logout操作时,我使用了Fiddler,因为我还在测试注销功能。我在里面放了一个断点,是的,该方法被成功调用。它调用authenticationManager.SignOut(),但我的受保护页面仍然有效。

因此,我决定将代码放在客户端中而不是使用Fiddler:

    var token = sessionStorage.getItem(tokenKey);
    var headers = {};
    if (token) {
        headers.Authorization = 'Bearer ' + token;
    }

    $.ajax({
        type: 'POST',
        url: '/api/Account/Logout',
        headers: headers
    }).done(function (data) {
        self.result("Logout Done!");
    }).fail(showError);

将此代码连接到Logout按钮,瞧!受保护的MVC页面现在在单击“注销”按钮后出现预期的401 Unauthorized错误。像往常一样,WebAPI资源也会出现预期的401错误。

它毕竟是有效的,我认为使用Fiddler进行测试的过程会导致问题。但是我无法解释为什么会这样。

感谢阅读。