ASP.NET Identity 2.0 注销不起作用

Posted

技术标签:

【中文标题】ASP.NET Identity 2.0 注销不起作用【英文标题】:ASP.NET Identity 2.0 Signout not working 【发布时间】:2015-02-09 10:45:35 【问题描述】:

我正在使用 ASP.NET 和 Identity 2.0 编写一个 Web API。如果用户成功“登录”,API 应该是可访问的。登录效果很好,但注销(注销)似乎不起作用。这是我正在使用的一些代码:

身份配置:

public static OAuthBearerAuthenticationOptions OAuthBearerOptions  get; private set; 

public void Configuration(IAppBuilder app)

    app.CreatePerOwinContext<IdentityDbContext<IdentityUser>>(HLAccountManager.CreateDbContext);
    app.CreatePerOwinContext<UserManager<IdentityUser>>(HLAccountManager.CreateUserManager);

    OAuthBearerOptions = new OAuthBearerAuthenticationOptions();

    app.UseOAuthBearerAuthentication(OAuthBearerOptions);
    app.UseCookieAuthentication(new CookieAuthenticationOptions
    
        AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
        LoginPath = new PathString("/Account/Login")
    );

    GlobalConfiguration.Configuration.SuppressDefaultHostAuthentication();
    GlobalConfiguration.Configuration.Filters.Add(new HostAuthenticationFilter("Bearer"));

身份验证控制器:

[HttpPost]
[ActionName("Authenticate")]
[AllowAnonymous]
public String Authenticate(JObject data)

    dynamic json = data;
    string user = json.user;
    string password = json.password;

    if (string.IsNullOrEmpty(user) || string.IsNullOrEmpty(password))
        return "failed";

    var userIdentity = UserManager.FindAsync(user, password).Result;
    if (userIdentity != null)
    
        var identity = new ClaimsIdentity(IdentityConfig.OAuthBearerOptions.AuthenticationType);
        identity.AddClaim(new Claim(ClaimTypes.Name, user));
        identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, userIdentity.Id));
        AuthenticationTicket ticket = new AuthenticationTicket(identity, new AuthenticationProperties());
        var currentUtc = new SystemClock().UtcNow;
        ticket.Properties.IssuedUtc = currentUtc;
        ticket.Properties.ExpiresUtc = currentUtc.Add(TimeSpan.FromMinutes(30));
        string AccessToken = IdentityConfig.OAuthBearerOptions.AccessTokenFormat.Protect(ticket);
        return AccessToken;
    
    return "failed";


[HttpGet]
[Authorize]
[ActionName("Logout")]
public String Logout()

    var owinContext = HttpContext.Current.GetOwinContext();
    owinContext.Authentication.SignOut(DefaultAuthenticationTypes.ApplicationCookie, DefaultAuthenticationTypes.ExternalBearer);

    return "OK";

Authenticate-method 效果很好。我的 webapp 从请求中获取一个令牌,我可以将其设置为 Authorization-header(例如,在 $http 中用于角度应用程序)。对 [Authorize] 注释函数的后续调用将正确返回。 但是,如果我调用 Logout,它将正确返回“OK”字符串,但不会使令牌无效。如果我在调用 Logout 后调用 Authorize 方法,我仍然会得到正确的值,而不是预期的 401 - Unauthorized。

我看过这篇文章:ASP.Net Identity Logout 并尝试了不带参数的注销。那也不行。 HttpContext 没有 GetOwinContext。就我而言,它在 HttpContext.Current 中。我做错了什么吗? 为什么我的注销方法不起作用?

【问题讨论】:

【参考方案1】:

似乎我弄错了(不记名)令牌的基本概念,这就是它不起作用的原因。我把这个留在这里,以防有人遇到同样的问题:

令牌不能被撤销或失效——至少在 ASP.NET Identity 2.0 中不能。 SignOut 不 为这些类型的身份验证工作。

对此的解决方案是所谓的刷新令牌。 Identity 2.0 或 OWIN 目前没有默认实现。但我找到了两篇博文,给出了解决方案:

http://bitoftech.net/2014/07/16/enable-oauth-refresh-tokens-angularjs-app-using-asp-net-web-api-2-owin/ http://leastprivilege.com/2013/11/15/adding-refresh-tokens-to-a-web-api-v2-authorization-server/

【讨论】:

以上是关于ASP.NET Identity 2.0 注销不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Asp.net Core 2.0 Identity.TwoFactorRememberMe 到期

在 ASP.NET Identity 2.0 中获取当前用户 ID

如何在现有数据库中实现 ASP.NET Identity 2.0?

Asp.net Identity 2.0 更新用户

ASP.NET Identity 2.0 解密 Owin cookie

迁移到 Asp.Net Identity 2.0:未在 AspNetUsers 表中创建新列