Owin 쿠키 인증 사용에 이상한 문제가 있습니다.
IIS 서버 인증을 시작하면 IE / Firefox 및 Chrome에서 완벽하게 작동합니다.
인증으로 몇 가지 테스트를 시작하고 다른 플랫폼에서 로그인했으며 이상한 오류가 발생했습니다. 산발적으로 Owin 프레임 워크 / IIS는 브라우저에 쿠키를 보내지 않습니다. 코드가 올바르게 실행되는 사용자 이름과 비밀번호를 입력하지만 쿠키가 브라우저에 전혀 전달되지 않습니다. 서버를 다시 시작하면 작동하기 시작하고 어느 시점에서 로그인을 시도하고 다시 쿠키 배달을 중지합니다. 코드를 단계별로 실행하면 아무 작업도 수행되지 않으며 오류가 발생하지 않습니다.
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);
}
}
}
});
그리고 내 로그인 절차에는 다음 코드가 있습니다.
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);
업데이트 1 : 문제의 원인 중 하나는 항목을 세션에 추가하여 문제가 시작되는 것 같습니다. 간단한 것을 추가 Session.Content["ABC"]= 123
하면 문제가 발생하는 것 같습니다.
내가 만들 수있는 것은 다음과 같습니다 : 1) (Chrome) 로그인하면 ASP.NET_SessionId + 내 인증 쿠키가 나타납니다. 2) session.contents를 설정하는 페이지로 이동합니다 ... 3) 새 브라우저 (Firefox)를 열고 로그인을 시도하면 ASP.NET_SessionId를받지 않거나 인증 쿠키를 얻지 않습니다 .4) 첫 번째 브라우저 계속 작동하는 ASP.NET_SessionId가 있습니다. 이 쿠키를 제거하는 순간 IP 주소 (10.xxx) 및 localhost에서 작업중 인 다른 모든 브라우저와 동일한 문제가 있습니다.
업데이트 2 :ASPNET_SessionId
OWIN으로 인증하기 전에 login_load 페이지 에서 처음으로 강제 생성 합니다.
1) OWIN으로 인증하기 전에 Session.Content
로그인 페이지에서 임의의 값을 만들어 ASP.NET_SessionId를 시작합니다 .2) 인증하고 추가 세션을 만듭니다 .3) 다른 브라우저가 작동하는 것 같습니다.
이것은 기괴하다. 나는 이것이 ASP 및 OWIN과 관련이 있다고 생각할 수 있습니다.
업데이트 3- 둘 사이의 이상한 동작.
추가 이상한 동작 식별-Owin 시간 초과 및 ASP 세션이 다릅니다. 내가보고있는 것은 내 Owin 세션이 일부 메커니즘을 통해 ASP 세션보다 오래 지속된다는 것입니다. 그래서 로그인 할 때 : 1.) 쿠키 기반 인증 세션이 있습니다.) 세션 변수를 설정했습니다.
owin 쿠키 세션 변수 이전의 세션 변수 (2) "die"는 강제로 다시 로그인하여 전체 응용 프로그램에서 예기치 않은 동작이 발생합니다. (사람은 로그인했지만 실제로는 로그인하지 않았습니다)
3B 업데이트
약간의 파기 후 페이지에서 "양식"인증 시간 초과 및 세션 시간 초과가 일치해야한다는 의견이있었습니다. 나는 정상적으로 두 가지가 동기화되어 있다고 생각하지만 어떤 이유로 든 두 가지가 동기화되어 있지 않습니다.
대안 요약
1) 인증 전에 항상 세션을 먼저 생성하십시오. 응용 프로그램을 시작할 때 기본적으로 세션 만들기Session["Workaround"] = 0;
2) [실험] 쿠키를 유지하는 경우 OWIN 시간 초과 / 길이가 web.config의 sessionTimeout보다 길어야합니다 (테스트 중).