2016-06-10 52 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)。

如果您希望令牌本身不再有效,那麼您需要維護已撤銷令牌的列表。由於各種原因,您可能希望您的訪問令牌始終有效,但是短暫停用並取消刷新令牌。