2016-12-13 41 views
9

ASP.NET Çekirdeği documentation'a göre, HttpContext.Authentication.SignOutAsync() yönteminin kimlik doğrulama çerezini de silmesi gerekir.HttpContext.Authentication.SignOutAsync, kimlik doğrulama bilgisi yok

oturumunu kapatma

geçerli kullanıcı oturumu kapatmak için ve çerez (italik mayın - AC) silin controller içerisinde şu çağrı

await HttpContext.Authentication.SignOutAsync("MyCookieMiddlewareInstance");

Ama öyle değil! Her şey iyi görünüyor, özellikle. auth şeması, çünkü kullanıcı doğru bir şekilde oturum açtığında ve çerezde .AspNetCore. yaratıldı.

Çerezin, kullanıcının şarkı söylemesinin ardından neden kaldığı hakkında herhangi bir fikrin var mı?

+0

bu hala geçerli mi? – Proviste

+1

Dokümanlar biraz değişti - "MyCookieMiddlewareInstance" yerine CookieAuthenticationDefaults.AuthenticationScheme diyorlar, ki bu da aynı değil. Ancak, kod çerezi silerse, kolayca kendiniz kontrol edeceğiniz bir şeydir.Sonuçta, bu AccountController denir (LogOff yöntemi uygulamanızı scaffolding olduğunda kimlik doğrulamasını etkinleştirdi. –

cevap

0

İşte (başka bir şey yardımcı olursa, kaba kuvvet kullanın) çerezi silen kod:

await this.HttpContext.Authentication.SignOutAsync(<AuthenticationScheme>); 

// ... 

var cookie = this.Request.Cookies[<CookieName>]; 
if (cookie != null) 
{ 
    var options = new CookieOptions { Expires = DateTime.Now.AddDays(-1) }; 
    this.Response.Cookies.Append(cookieName, cookie, options); 
} 

, kötü, kötü kötü! Çok çirkin bir yama gibi görünüyor! Ama çalışır ... :(

Herhangi diğer çözümler

2

Aynı sorun var SignOutAsync bunu buldum olarak gerektiği

çalışmaz:?.

.
Response.Cookies.Delete(".AspNetCore.<nameofcookie>"); 
+0

Nerede? Kaynak kodu veya başka bir yerde (blog, cevap, vb)? Ve sihirli dizeleri daha kısa kodu rağmen, gerçekten kötü. –

2

Site çerezlerimi denetleyicideki Logout() yöntemine yerleştirilmiş olan aşağıdaki snippet'i silerek sorununu çözdüm. sitem tarafından oluşturulacak.

// Delete the authentication cookie(s) we created when user signed in 
      if (HttpContext.Request.Cookies[".MyCookie"] != null) 
      { 
       var siteCookies = HttpContext.Request.Cookies.Where(c => c.Key.StartsWith(".MyCookie")); 
       foreach (var cookie in siteCookies) 
       { 
        Response.Cookies.Delete(cookie.Key); 
       } 
      } 

Ve Startup.cs içinde

: Google ile OpenIdConnect kullanıyorum beri await HttpContext.Authentication.SignOutAsync("MyCookieMiddlewareInstance"); kullanmayın

app.UseCookieAuthentication(new CookieAuthenticationOptions() 
      { 
       AuthenticationScheme = "Cookies", 
       LoginPath = new PathString("/Account/Login/"), 
       AccessDeniedPath = new PathString("/Home/Index/"), 
       AutomaticAuthenticate = true, 
       AutomaticChallenge = true, 
       CookieName = ".MyCookie" 
      }); 

dikkat edin.

+0

Sanırım sadece tek bir çerez (auth one) silinmelidir.Tüm siteniz tarafından yerleştirilen tüm çerezlerin silinmesi işe yaramasına rağmen çok kaba bir kuvvet gibi görünebilir ve istenmeyen bir durum gibi gözükebilir ve tek bir çerez silme Castro'nun önerdiği bir çözüm gibi görünüyor. JR, bir fark görüyor musun? Yine de teşekkürler. –

2

Sen söyleyecek kadar kod sonrası yoktu, ama ben SignOutAsync çalışır sorunu olduğunu OIDC endsession URL'ye yönlendirme üzerine yazar hangi SignOutAsync diyoruz sen (örneğin RedirectToAction) yönlendirme bazı tip sonra şüpheli.

(yönlendirme üzerine yazma sorunu için aynı açıklama Microsoft'un Haok tarafından here verilir.)

Edit: Benim spekülasyon yukarıda doğruysa, çözüm nihai SignOutAsync ile AuthenticationProperties nesnede bir yönlendirme URL'si göndermektir :

// 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 the HttpContextAccessor 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); 
}