2016-01-21 23 views
5

Tôi có ứng dụng Asp.Net MVC (phiên bản 6.0.0-rc1-final) với vai trò tùy chỉnh và cửa hàng người dùng. Sau một số struggling Cuối cùng tôi có thể tạo cơ chế đăng nhập hoạt động. Tuy nhiên bây giờ tôi có khó khăn để tạo ra một đăng xuất sạch. Những gì mã logout của tôi trong bộ điều khiển hiện trông giống như:Cookie không bị xóa sau khi đăng xuất với Asp.Net 5 Identity 3.0

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

    } 

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

Vấn đề với mã này được, rằng một cookie được không xóa: .AspNet.Microsoft.AspNet.Identity.Application

Chừng nào vì tôi không xóa cookie theo cách thủ công, ứng dụng ở trạng thái bẩn và ném ngoại lệ con trỏ null vì User.Identity là rỗng.

Tôi đã tìm thấy một số question on stackoverflow mô tả một trường hợp tương tự. Nhưng giải pháp đó không phù hợp với tôi vì tôi đang sử dụng MVC 6 mà không có System.Web nữa.

Tôi cũng có giải pháp mẫu hoạt động tốt. Trong giải pháp này, cookie được đề cập không bao giờ được tạo. Có lẽ giải pháp đúng là không xóa cookie sau khi đăng xuất, mà là ngăn chặn bằng cách nào đó tạo ra cookie.

+0

@ Maxisam, bạn có tìm thấy một giải pháp trong khi chờ đợi không? –

+0

không, nhưng như tôi đã nói nó không thực sự quan trọng. Dường như không có gì liên quan đến dữ liệu xác thực. – maxisam

Trả lời

1

Vấn đề là RedirectToAction của bạn sẽ ghi đè chuyển hướng đến URL kết thúc của máy chủ Identity mà SignOutAsync vấn đề.

(. Lời giải thích tương tự cho cùng một vấn đề được đưa ra here bởi HaoK của Microsoft)

Edit: Giải pháp là để gửi một URL chuyển hướng trong một đối tượng AuthenticationProperties với trận chung kết 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

Rất tiếc, tôi không thể xác minh giải pháp của bạn vì tôi không làm việc gì thêm cho dự án này - tuy nhiên, giải pháp của bạn có vẻ rất hứa hẹn với tôi. –

+0

Vâng, tôi nghĩ bạn đã tiếp tục, nhưng tôi thấy vấn đề này rất thường xuyên, tôi muốn nhận câu trả lời cho một vài người khác vì đó là một vấn đề khá phức tạp. Đã cho tôi một vài ngày để theo dõi nó xuống bản thân mình! – McGuireV10

1

tôi có thể sửa chữa tình trạng dơ bẩn của ứng dụng của tôi sau khi logout bằng cách thủ công xóa cookie sau khi hành động logout:

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"); 
} 

Như cookie không thể xóa khỏi máy chủ trực tiếp tôi chỉ ghi đè lên các tập tin cookie đang tồn tại với một đã đã hết hạn.

+1

Tôi chỉ tìm ra của tôi. Vấn đề của tôi là tôi đã ghi đè lên SignOutAsync không chính xác. Sau khi tôi gỡ bỏ nó và sử dụng bản gốc. Nó hoạt động chính xác ngay bây giờ. – maxisam

+0

@maxisam Bạn có thể xây dựng thêm? Tôi cũng gặp vấn đề tương tự ở đây. –

+0

@HaikalNashuha xin lỗi tôi không nhớ nó là gì. Tôi tin rằng tôi đã cố gắng để tạo ra phương pháp của riêng tôi cho máy chủ nhận dạng nhưng tôi ghi đè SignOutAsync không chính xác. – maxisam

Các vấn đề liên quan