无法使用 Owin 注销 Web Api

2024-02-10

我已使用 owin 登录,但无法注销。
在开始时:


 
public void ConfigureOAuth(IAppBuilder app)
        {
   OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions()
            {
                AllowInsecureHttp = true,
                TokenEndpointPath = new PathString("/token"),
                AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(20),
                Provider = new AuthorizationServerProvider(),
                AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie               
            };
            app.UseOAuthBearerTokens(OAuthServerOptions);
            app.UseCookieAuthentication(new CookieAuthenticationOptions());
        }
  

在 AuthorizationServerProvider 中:



 public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
        {
            context.Validated();
            return Task.FromResult(null);
        }

        public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
        {
            context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*"});
            using (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();
                    return;
                }
            }
            //context.Request.
            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);
            }
            else
            {
                context.Request.Context.Authentication.SignOut();
            }

            context.Validated(identity);
        }
  


在 API 控制器中:

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

我调用注销然后使用旧令牌,但它仍然可以使用。那么注销不起作用吗? 感谢您的观看。


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

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

说实话,我不会为此烦恼。如果您沿着这条路线走下去,则意味着您没有使用 Owin 来完成其应有的用途,即应用程序级身份验证,而不是用户身份验证。两者之间存在巨大差异。

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

所以底线是:owin 代币在过期之前一直有效。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法使用 Owin 注销 Web Api 的相关文章

随机推荐