ASP.NET 标识 2.0 注销不起作用

本文关键字:注销 不起作用 NET 标识 ASP | 更新日期: 2023-09-27 18:33:51

我正在编写一个具有 ASP.NET 和身份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";
}

身份验证方法运行良好。我的 web 应用程序从请求中获取一个令牌,我可以将其设置为授权标头(例如,对于角度应用程序,$http(。对 [Authorize] 注释函数的后续调用将正确返回。但是,如果我调用 Logout,它将正确返回"OK"字符串,但不会使令牌无效。如果我在调用 Logout 后调用 Authorize-方法,我仍然会得到一个正确的值,而不是预期的 401 - 未经授权。

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

ASP.NET 标识 2.0 注销不起作用

似乎我弄错了(持有者(令牌的基本概念,这就是它不起作用的原因。我把它留在这里,以防有人绊倒同样的问题:

令牌不能被吊销或失效 - 至少不能在 ASP.NET 标识 2.0 中。注销不会适用于这些类型的身份验证。

对此的解决方案是所谓的刷新令牌。标识 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/