2011-09-23 10 views
0

2 개의 MVC3 인터넷 웹 사이트가 있습니다. One (Site1)은 Windows 인증을 사용하며 로컬 인트라넷 영역에 있습니다. 두 번째 (Site2)는 공개적으로 사용할 수 있으며 폼 인증을 사용합니다. 두 사이트 모두 동일한 도메인에 있지만 다른 하위 도메인이 있습니다. 두 사람 사이에 인증 쿠키를 공유하려고합니다. 이렇게하려면 웹 설정에서 동일한 설정이 필요합니다. 때로는 이것이 작동하지만 대부분의 경우에는 그렇지 않습니다. 누구나 네트워크 외부에서 Site1에 접속하면 403 오류가 발생하며 이는 좋은 결과입니다. 네트워크 사용자가 Site1에 접속하면 네트워크 자격 증명을 기반으로 허용됩니다. 그런 다음 아래 코드로 사용자 역할을 확인합니다. 내가 역할을 확인하면ASP.NET 사이트 인증 쿠키 공유

var userName = string.Empty; 
var winId = (WindowsIdentity)HttpContext.User.Identity; 
var winPrincipal = new WindowsPrincipal(winId); 

if(winPrincipal.IsInRole("SiteAdmin")) { 
    FormsAuthentication.SetAuthCookie("siteadmin", false); 
    userName = "siteadmin"; //This is a Forms Auth user 
} 
else if(///I check for other roles here and assign like above) 

, 나는 사용자가 위의 경우 ... 문에서 결정된 역할 중 하나에있는 경우 그들을 위해 쿠키를 만들어 사이트 2에 전달할.

if(!string.IsNullOrEmpty(userName)) { 
    //Add a cookie that Site2 will use for Authentication 
    var cookie = FormsAuthentication.GetAuthCookie(userName, false); 
    cookie.Domain = FormsAuthentication.CookieDomain; //This may need to be changed to actually set the Domain to the Domain of the TVAP site. 

    HttpContext.Response.Cookies.Add(cookie); 
} 

//Network users not found in roles will simply be forwarded without a cookie and have to login 
HttpContext.Response.RedirectPermanent(tvapUrl); 

는 I는 각 사이트의 Web.config 일치하는 MachineKey (validationKey의, 및 decryptionKey 및 검증)에서 설정 한.

모드를 제외하고 둘 다 동일한 인증 설정을 사용합니다. 그래서 이것에 대한 내 구성은 다음과 같습니다.

<authentication mode="Forms"> 
     <forms loginUrl="~/Account/LogOn" name=".ASPXFORMSAUTH" protection="All" path="/" domain="mydomain.com" enableCrossAppRedirects="true" timeout="2880" /> 
    </authentication> 

제 생각에는 '인증'모드가 각각 다르므로 Site2는 site1의 인증 쿠키를 사용하지 않습니다. 그래도 그냥 추측입니다. 어쨌든 문제를 파악할 수 있습니까?

this article에 따르면, 내가 여기서해야 할 것은 작동해야합니다. 그리고 쿠키가 작동하고 재사용 될 수 있기 때문에 제대로 작동한다고 생각하는 경우가 있습니다.하지만 말하기는 어렵습니다. 나는 누군가가 내가 여기에서 빠진 것을 볼 수 있기를 바라고, 대안의 해결책을 가지고있다.

정상적으로 로그인 한 후 Site2에서 인증 쿠키를 검사했는데 도메인이 설정되지 않았으므로 해당 코드 줄을 제거했습니다. 또한 날짜가 설정되지 않은 경우 만료되는 쿠키에 대해 읽으므로 요청과 함께 보내기 전에 쿠키에 만료일을 설정합니다.

그래서 두 가지 변경 사항을 통해 여기에 있습니다.

Chrome 및 Firefox에서는 작동하지만 IE에서는 작동하지 않습니다. 확실하지 않다. 나는 다른 기계와 다른 사용자로부터 몇 가지 추가 테스트를 할 것이므로 나머지 쿠키를 가지고 있지 않다는 것을 안다.

답변

2

내 문제가 내 쿠키의 만료 속성을 설정하지 않는다고 판단되었습니다. this Microsoft article에 따르면 Expires 속성이 설정되어 있지 않으면 클라이언트에 쿠키가 기록되지 않습니다.

"쿠키의 만료를 설정하지 않으면 쿠키가 만들어 지지만 사용자의 하드 디스크에 저장되지 않고 사용자 세션 정보의 일부로 유지 관리됩니다. 사용자가 브라우저를 닫으면, 쿠키는 폐기됩니다. 이와 같은 비 영구 쿠키는 잠시 동안 저장해야하거나 보안상의 이유로 클라이언트 컴퓨터의 디스크에 기록해서는 안되는 정보에 유용합니다. 예 : 비 영구 쿠키 쿠키를 디스크에 쓰지 않으려는 공개 컴퓨터에서 사용자가 작업 할 때 유용합니다. "

이 경우 다른 사이트로 서버를 전송할 때 쿠키를 디스크에 기록해야하므로 해당 사용자의 세션이 종료됩니다. 나는 이것이 수정본이라고 100 % 확신하지는 못했지만 지금은 효과가 있다고 가정하고 있습니다.