Tôi gặp vấn đề lạ khi sử dụng xác thực cookie Owin.
Khi tôi khởi động xác thực máy chủ IIS của tôi hoạt động hoàn toàn tốt trên IE / Firefox và Chrome.
Tôi bắt đầu thực hiện một số thử nghiệm với Xác thực và đăng nhập trên các nền tảng khác nhau và tôi đã gặp phải một lỗi lạ. Một cách ngẫu nhiên, khung Owin / IIS không gửi bất kỳ cookie nào tới trình duyệt. Tôi sẽ nhập tên người dùng và mật khẩu đúng mã đang chạy nhưng không có cookie nào được gửi đến trình duyệt cả. Nếu tôi khởi động lại máy chủ thì nó bắt đầu hoạt động, đến một lúc nào đó tôi sẽ thử đăng nhập và một lần nữa cookie sẽ ngừng được giao. Bước qua mã không làm gì và ném không có lỗi.
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationMode = AuthenticationMode.Active,
CookieHttpOnly = true,
AuthenticationType = "ABC",
LoginPath = new PathString("/Account/Login"),
CookiePath = "/",
CookieName = "ABC",
Provider = new CookieAuthenticationProvider
{
OnApplyRedirect = ctx =>
{
if (!IsAjaxRequest(ctx.Request))
{
ctx.Response.Redirect(ctx.RedirectUri);
}
}
}
});
Và trong thủ tục đăng nhập của tôi, tôi có đoạn mã sau:
IAuthenticationManager authenticationManager = HttpContext.Current.GetOwinContext().Authentication;
authenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
var authentication = HttpContext.Current.GetOwinContext().Authentication;
var identity = new ClaimsIdentity("ABC");
identity.AddClaim(new Claim(ClaimTypes.Name, user.Username));
identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, user.User_ID.ToString()));
identity.AddClaim(new Claim(ClaimTypes.Role, role.myRole.ToString()));
authentication.AuthenticationResponseGrant =
new AuthenticationResponseGrant(identity, new AuthenticationProperties()
{
IsPersistent = isPersistent
});
authenticationManager.SignIn(new AuthenticationProperties() {IsPersistent = isPersistent}, identity);
Cập nhật 1: Dường như một nguyên nhân của vấn đề là khi tôi thêm các mục vào phiên giao dịch vấn đề bắt đầu. Thêm một cái gì đó đơn giản như Session.Content["ABC"]= 123
dường như để tạo ra vấn đề.
Những gì tôi có thể thực hiện như sau: 1) (Chrome) Khi tôi đăng nhập, tôi nhận được ASP.NET_SessionId + cookie xác thực của mình. 2) Tôi đi đến một trang đặt session.contents ... 3) Mở trình duyệt mới (Firefox) và thử đăng nhập và nó không nhận được ASP.NET_SessionId và cũng không nhận được Cookie xác thực 4) trong khi trình duyệt đầu tiên Có ASP.NET_SessionId nó tiếp tục hoạt động. Ngay khi tôi gỡ bỏ cookie này, nó có cùng một vấn đề với tất cả các trình duyệt khác mà tôi đang làm việc trên địa chỉ IP (10.xxx) và localhost.
Cập nhật 2: Tạo lực lượngASPNET_SessionId
lần đầu tiên trên trang login_load của tôi trước khi xác thực bằng OWIN.
1) trước khi tôi xác thực với OWIN, tôi tạo ngẫu nhiên Session.Content
giá trị trên trang đăng nhập của mình để bắt đầu ASP.NET_SessionId 2) sau đó tôi xác thực và thực hiện các phiên tiếp theo 3) Các trình duyệt khác dường như đã hoạt động
Điều này thật kỳ quái. Tôi chỉ có thể kết luận rằng điều này có liên quan đến ASP và OWIN khi nghĩ rằng chúng thuộc các lĩnh vực khác nhau hoặc đại loại như thế.
Cập nhật 3 - Hành vi kỳ lạ giữa hai người.
Hành vi lạ khác được xác định - Thời gian chờ của phiên Owin và ASP là khác nhau. Những gì tôi đang thấy là các phiên Owin của tôi tồn tại lâu hơn các phiên ASP của tôi thông qua một số cơ chế. Vì vậy, khi đăng nhập: 1.) Tôi có phiên auth dựa trên cookied 2.) Tôi đặt một vài biến phiên
Biến phiên của tôi (2) "chết" trước khi biến phiên của phiên owin buộc phải đăng nhập lại, điều này gây ra hành vi không mong muốn trong toàn bộ ứng dụng của tôi. (Người đã đăng nhập nhưng không thực sự đăng nhập)
Cập nhật 3B
Sau khi đào bới, tôi thấy một số bình luận trên một trang cho biết thời gian chờ xác thực "biểu mẫu" và thời gian chờ phiên cần khớp. Tôi đang nghĩ bình thường hai người không đồng bộ nhưng vì lý do gì hai người không đồng bộ.
Tóm tắt cách giải quyết
1) Luôn tạo Phiên trước khi xác thực. Về cơ bản tạo phiên khi bạn khởi động ứng dụngSession["Workaround"] = 0;
2) [Thử nghiệm] nếu bạn duy trì cookie, hãy đảm bảo thời gian chờ / thời gian OWIN của bạn dài hơn sessionTimeout trong web.config (đang thử nghiệm)