c# - ASP.NET Identity 2.0 注销不工作

标签 c# asp.net asp.net-mvc angularjs asp.net-identity-2

我正在使用 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"));
}

认证 Controller :

[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 方法运行良好。我的 webapp 从请求中获取一个 token ,我可以将其设置为授权 header (例如,在 $http 中用于 Angular 应用程序)。对 [Authorize] 注释函数的后续调用将正确返回。 但是,如果我调用注销,它会正确返回“OK”字符串,但不会使 token 无效。如果我在调用注销后调用授权方法,我仍然会得到正确的值,而不是预期的 401 - 未经授权。

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

最佳答案

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

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

对此的解决方案是所谓的刷新 token 。目前在 Identity 2.0 或 OWIN 中没有默认实现。但是我找到了两篇博客文章,其中包含一个解决方案:

关于c# - ASP.NET Identity 2.0 注销不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27414574/

相关文章:

c# - 提高应用程序性能

带有外部图像的 ASP.NET rdlc 不以 PDF 显示图像

asp.net-mvc - Umbraco 中的 session 开始和 session 结束

c# - 从 mvc Controller 设置一个 javascript 变量

c# - C# 中的空合并运算符和运算符 &&

c# - 有没有办法在C#中组合“is”和“as”

c# - 如何在 ExecuteQueryDynamic 上的 LinqPad 上设置查询超时?

asp.net - 在window azure中更改web.config的权限

c# - 有什么方法可以将 ASP.NET Core 2.0 HTTPS 限制为 TLS 1.2?

asp.net-mvc - ASP.NET MVC 4 包在文件夹路径中带有通配符