无法使用 Owin 退出 Web Api

Posted

技术标签:

【中文标题】无法使用 Owin 退出 Web Api【英文标题】:Can't sign out Web Api using Owin 【发布时间】:2016-11-25 21:15:39 【问题描述】:

我已使用 owin 登录,但无法退出。 在开始:

公共无效 ConfigureOAuth(IAppBuilder 应用程序) OAuthAuthorizationServerOptions OAuthServerOptions = 新 OAuthAuthorizationServerOptions() AllowInsecureHttp = true, TokenEndpointPath = new PathString("/token"), AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(20), 提供者 = 新 AuthorizationServerProvider(), AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie ; app.UseOAuthBearerTokens(OAuthServerOptions); app.UseCookieAuthentication(new CookieAuthenticationOptions());

在 AuthorizationServerProvider 中:

公共覆盖任务 ValidateClientAuthentication(OAuthValidateClientAuthenticationContext 上下文) context.Validated(); 返回 Task.FromResult(null); 公共覆盖异步任务 GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext 上下文) context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] "*"); 使用 (demoEntities _repo = new demoEntities()) if (!_repo.users.Where(x => x.username == context.UserName && x.pass == context.Password).Any()) context.SetError("invalid_grant", "wrong."); //context.Rejected(); 返回; //上下文.请求。 var identity = new ClaimsIdentity(context.Options.AuthenticationType); identity.AddClaim(new Claim("sub", context.UserName)); identity.AddClaim(new Claim("role", "user")); identity.AddClaim(new Claim(ClaimTypes.Name, context.UserName)); if (context.Request.Path.Value != "/api/apidemo/logout") context.Request.Context.Authentication.SignIn(identity); 别的 context.Request.Context.Authentication.SignOut(); context.Validated(身份);

在 ApiController 中:

  [HttpGet]
    [ActionName("logout")]
    public IHttpActionResult logout()
    
        Request.GetOwinContext().Authentication.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
        this.Authentication.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
        return Ok();
    

我调用注销然后使用旧令牌但它仍然可以使用。所以注销不起作用? 感谢收看。

【问题讨论】:

【参考方案1】:

这不是 Owin 的工作方式。没有注销。您获得一个令牌,并且该令牌在一定时间内有效。令牌在过期之前一直有效。

您可以自己添加一个额外的层,基本上是在生成令牌时,将其与到期数据和有效状态一起存储在某个地方。当您调用注销时,您将令牌更新为无效,然后当它被使用时,在它通过 owin 检查后,您然后运行您自己的检查并将其无效。

老实说,我不会为此烦恼。如果你沿着这条路线走,这意味着你没有使用 Owin 来完成它的目的,即应用程序级别的身份验证,而不是用户身份验证。两者差别很大。

因此,我的建议是使用会员系统进行用户身份验证,并将 owin 的东西分开。如果您这样做,那么您实际上可以注销某人。

所以底线是:owin 令牌在过期之前都是有效的。

【讨论】:

你能帮我解决这个问题吗:***.com/questions/47096113/…

以上是关于无法使用 Owin 退出 Web Api的主要内容,如果未能解决你的问题,请参考以下文章

在使用 Owin 自托管的 Web API 中获取远程主机 IP

Microsoft Owin Cors允许所有不能在Chrome for Web API中使用

Web API 2,OWIN 身份验证,SignOut 不注销

双重 OWIN 身份验证无法协同工作

Asp.Net Web API oAuth 2.0 无法使用包含与号 (&) 的密码进行验证

Asp.Net Web API 2第十课——使用OWIN自承载Web API