WebAPI OAuth注销 – 如何删除令牌Cookie?

我有一个OAAP登录的WebAPI配置如下:

app.UseOpenIdConnectAuthentication( new OpenIdConnectAuthenticationOptions { ClientId = clientId, Authority = authority, PostLogoutRedirectUri = "https://www.microsoft.com/", Notifications = new OpenIdConnectAuthenticationNotifications { AuthenticationFailed = context => { context.HandleResponse(); context.Response.Redirect("/Error?message=" + context.Exception.Message); return Task.FromResult(0); } } }); 

和使用登录强制执行所有控制器

 config.Filters.Add(new System.Web.Http.AuthorizeAttribute()); 

我现在想要添加一个名为LogoutController的ApiController(猜猜它是做什么的)。

我发现我可以使用从MVC注销

 System.Web.Security.FormsAuthentication.SignOut(); 

但我没有这样从WebAPI注销。 我还没有找到任何有关如何从WebAPI注销的信息。 但是我发现注销过程中可能存在错误,cookie被保留并且必须手动删除 ,但是,代码再次是MVC,似乎我无法将HttpCookie放入我的HttpResponseMessage对象中:

  [HttpGet] public HttpResponseMessage Logout() { FormsAuthentication.SignOut(); // clear authentication cookie HttpCookie cookie1 = new HttpCookie(FormsAuthentication.FormsCookieName, ""); cookie1.Expires = DateTime.Now.AddYears(-1); var response = Request.CreateResponse(HttpStatusCode.OK); response.Content = new StringContent("Logout successful
You have been successfully logged out.
You can close this window/tab now.
"); response.Headers.AddCookies(cookie1); // Types don't match return response; }

如何才能实现我的WebAPI已注销,并且在登录之前需要再次执行OAuth?

您无法注销API,因为您尚未登录!

例如,假设您的API使用Facebook作为其OpenID身份validation提供程序。 您的用户必须登录Facebook才能使用您的API。 您的API会将它们重定向到facebook auth服务器,如果他们没有登录 – Facebook会要求他们登录。

如果用户决定保持登录Facebook,那么每次他们使用您的API时,他们都不需要再次登录到Facebook,您的中间件代码将获得有效的令牌,以便他们访问您的API。

您的API无法删除Facebook和用户浏览器之间的浏览器cookie,因此您无法将其从Facebook注销,因此您无法阻止他们在需要时获取新令牌。

我不知道您使用的OpenID提供程序,但我认为以上适用于任何。

您可以注销MVC应用程序,因为它会在您登录时在您(用户代理)和MVC应用程序之间创建一个cookie。它可以删除自己的cookie!

最简单的方法是让客户端自己“忘记”令牌 – 无需告诉服务器它(这是清除auth cookie真正做的事情 – 让浏览器删除cookie)。

如果您希望令牌本身不再有效,则需要维护已撤销令牌列表。 由于各种原因,您可能希望访问令牌始终有效但短暂存在并取消刷新令牌。