2016-01-21 96 views
5

我確實有一個帶有自定義角色和用戶存儲的Asp.Net MVC應用程序(版本6.0.0-rc1-final)。在一些struggling後我終於可以創建一個工作登錄機制。不過,我現在有麻煩創建一個乾淨的註銷。在控制器什麼我註銷代碼目前的樣子:使用Asp.Net註銷後Cookie未被刪除5 Identity 3.0

public async Task<ActionResult> Logout() 
{ 
    if (User.Identity.IsAuthenticated) 
    { 
    await SignInManager.SignOutAsync(); 

    } 

    return RedirectToAction("Index", "App"); 
} 

這段代碼的問題是,一個cookie不會刪除:.AspNet.Microsoft.AspNet.Identity.Application

只要因爲我不會手動刪除cookie,所以應用程序處於髒狀態並拋出空指針異常,因爲User.Identity爲空。

我找到了描述類似場景的question on stackoverflow。但是這個解決方案並不適合我,因爲我使用的是沒有System.Web的MVC 6。

我也有一個示例解決方案,它工作正常。在這個解決方案中,所提到的cookie從未被創建。也許正確的解決方案不是在註銷後刪除cookie,而是爲了防止以某種方式創建cookie。

+0

@ Maxisam,您在此期間找到了解決方案嗎? –

+0

nope,但就像我說的那並不重要。這似乎與認證數據無關。 – maxisam

回答

1

問題是您的RedirectToAction覆蓋重定向到SignOutAsync問題的Identity Server終端URL。

(對於同樣的問題同樣的解釋是由微軟的HaoK給出here

編輯:解決的辦法是發送重定向URL在AuthenticationProperties對象與最終SignOutAsync

// in some controller/handler, notice the "bare" Task return value 
public async Task LogoutAction() 
{ 
    // SomeOtherPage is where we redirect to after signout 
    await MyCustomSignOut("/SomeOtherPage"); 
} 

// probably in some utility service 
public async Task MyCustomSignOut(string redirectUri) 
{ 
    // inject IHttpContextAccessor to get "context" 
    await context.SignOutAsync("Cookies"); 
    var prop = new AuthenticationProperties() 
    { 
     RedirectUri = redirectUri 
    }); 
    // after signout this will redirect to your provided target 
    await context.SignOutAsync("oidc", prop); 
} 
+1

不幸的是,我無法驗證你的解決方案,因爲我不再爲這個項目工作 - 但不過你的解決方案聽起來對我很有希望。 –

+0

是的,我想你會繼續前進,但我經常看到這個問題,我想爲其他幾個人找到答案,因爲這是一個非常棘手的問題。花了我幾天的時間來追蹤它! – McGuireV10

1

我可以解決通過手動註銷後,我的應用程序的髒數據刪除cookie註銷行動後:與已

public async Task<ActionResult> Logout() 
{ 
    if (User.Identity.IsAuthenticated) 
    { 
     await SignInManager.SignOutAsync(); 
    } 

    foreach (var key in HttpContext.Request.Cookies.Keys) 
    { 
     HttpContext.Response.Cookies.Append(key, "", new CookieOptions() { Expires = DateTime.Now.AddDays(-1) }); 
    } 
    return RedirectToAction("Index", "App"); 
} 

餅乾不能從服務器直接刪除我只是簡單地覆蓋現有的cookie通過了有效期限。

+1

我只是想出了我的。我的問題是我錯誤地忽略了SignOutAsync。我刪除它並使用原來的。它現在可以正常工作。 – maxisam

+0

@maxisam你能詳細解釋一下嗎?我也有同樣的問題。 –

+0

@HaikalNashuha抱歉,我不記得現在是什麼。我相信我試圖爲身份服務器創建自己的方法,但我錯誤地忽略了SignOutAsync。 – maxisam