2016-06-10 50 views
1

我有配置这样的OAuth登录时的WebAPI:WebAPI OAuth注销 - 如何删除令牌Cookie?

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(猜它做什么)强制执行所有控制器。

I have found that I can logout from MVC使用

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

但我不从的WebAPI注销的方式。我还没有找到任何信息如何从WebAPI注销。但我发现,there may be a bug in logout procedure, the cookie is kept and has to be removed manually,但随后,该代码是MVC一遍,它好像我不能得到一个HttpCookie进入我HttpResponseMessage对象:我怎样才能做到这一点我的WebAPI被注销

[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("<html><title>Logout successful</title><body style=\"font-family:sans-serif\"><div style=\"display:table; width:100%; height:100%; margin:0; padding:0; \"><div style=\"display:table-cell; vertical-align:middle; text-align:center;\">You have been successfully logged out.<br>You can close this window/tab now.</div></div></body></html>"); 
     response.Headers.AddCookies(cookie1); // Types don't match 
     return response; 
    } 

并且在我登录之前需要再次完成OAuth?

回答

3

由于您未登录API,因此无法注销!

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

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

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

我不知道你使用了什么OpenID提供程序,但我会认为上述适用于任何。

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

3

最简单的方法是让客户端自己“忘记”令牌 - 不需要告诉服务器有关它的信息(这就是清除auth cookie的真正目的 - 使浏览器删除cookie)。

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