2012-12-21 4 views
4

API 문서 사이트 인 MVC 애플리케이션이 있습니다. 양식에 앉아 있습니다. 인증 사이트에는 실제로 페이지가 2 개 있습니다.) 사이트의 모든 엔드 포인트와 데이터 오브젝트. 이 데이터 오브젝트/엔드 포인트 중 하나를 클릭하여 세부 사항 페이지로 이동할 수 있습니다.모든 탐색 액션에서 로그인 페이지로 리디렉션되는 사이트

각 페이지는 [Authorize(Roles="role,names,here")] 속성으로 장식되어 있습니다. 예상대로 사이트에 들어가면 로그인 페이지로 리디렉션되며 그 이후의 모든 요청은 작동합니다.

그러나 어제 사이트가 작동하기 시작했으며 이유가 확실하지 않습니다. 초기 로그인 후에 요청한 페이지가 정상적으로로드됩니다. 그러나 링크를 클릭하여 다른 페이지로 이동할 때마다 사용자가 로그인 페이지로 리디렉션되고 자격 증명이 더 이상 작동하지 않습니다.

어떤 문제가 발생했는지, 어떻게 해결할 수 있습니까?

[편집] 이유는 모르겠지만 내 sessionState 구성이 내 web.config에서 주석 처리되었습니다. (그렇게하지 않았고, 말했듯이 48 시간 전) 이 그것을 고정 주석을 나타납니다 : 그것은 더 나은이었다

<sessionState mode="InProc" customProvider="DefaultSessionProvider"> 
    <providers> 
    <add name="DefaultSessionProvider" type="System.Web.Providers.DefaultSessionStateProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="dbConn"/> 
    </providers> 
</sessionState> 
+2

인증에 기본 회원 공급자를 사용하고 있습니까? –

+0

네, 이것이 mvc4가있는 기본 멤버쉽 공급자입니다 - 그래서 유니버설 공급자입니다. –

+0

로그인 한 후 브라우저의 디버그 도구를 사용하여 응답을 확인하여 인증 쿠키 만료 설정이 무엇인지 확인할 수 있습니까? –

답변

0

가 session.But이를 사용하여 제공하는 우리에게 당신의 클래스를 보여 : 이 같은 계정 제어해야합니다 :

UserApplication userApp = new UserApplication(); 
SessionContext context = new SessionContext(); 
public ActionResult Login() 
     { 
      return View(); 
     } 

     [HttpPost] 
     public ActionResult Login(User user) 
     { 
      var authenticatedUser = userApp.GetByUsernameAndPassword(user);//you get the user from your application and repository here 
      if (authenticatedUser != null) 
      { 
       context.SetAuthenticationToken(authenticatedUser.UserId.ToString(),false, authenticatedUser); 
       return RedirectToAction("Index", "Home"); 
      } 

      return View(); 
     } 

     public ActionResult Logout() 
     { 
      FormsAuthentication.SignOut(); 
      return RedirectToAction("Index", "Home"); 
     } 

을 그리고 당신의 SessionContext이 될 것입니다 이렇게 :

public class SessionContext 
    { 
     public void SetAuthenticationToken(string name, bool isPersistant, User userData) 
     { 
      string data = null; 
      if (userData != null) 
       data = new JavaScriptSerializer().Serialize(userData); 

      FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, name, DateTime.Now, DateTime.Now.AddYears(1), isPersistant, userData.UserId.ToString()); 

      string cookieData = FormsAuthentication.Encrypt(ticket); 
      HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, cookieData) 
      { 
       HttpOnly = true, 
       Expires = ticket.Expiration 
      }; 

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

     public User GetUserData() 
     { 
      User userData = null; 

      try 
      { 
       HttpCookie cookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName]; 
       if (cookie != null) 
       { 
        FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(cookie.Value); 

        userData = new JavaScriptSerializer().Deserialize(ticket.UserData, typeof(User)) as User; 
       } 
      } 
      catch (Exception ex) 
      { 
      } 

      return userData; 
     } 
    } 
관련 문제