2014-05-21 1 views
0

GenericPrincipal을 통해 사용자 자격 증명을 설정하는 자격 증명 방법이 있습니다. 나는 User.IsInRole ("STANDART") 컨트롤러 액션에을 확인 할 asp.net MVCGenericPrincipal IsInRole은 HttpContext.User에 대해 false를 반환합니다.

public void SetCredentials(HttpContextBase context, string username, bool createPersistenceCookie) 
    { 
     FormsAuthentication.SetAuthCookie(username, createPersistenceCookie); 

     IIdentity identity = new GenericIdentity(username); 
     IPrincipal principal = new GenericPrincipal(identity,new []{"standart"}); 

     context.User = principal; 
    } 

를 사용하고 있지만, false를 돌려줍니다. 내 응용 프로그램에서 context.User를 사용하기를 원하지만 항상 false를 돌려

false를 반환 //

  • context.User.IsInRole ("STANDART").

+0

컨텍스트 사용자가 CurrentPrincipal과 동일합니까? – Prescott

+0

'Thread.CurrentPrincipal.IsInRole ("standart")'가 true를 반환한다는 사실은 게시물의 제목과 모순됩니다. Thread.CurrentPrincipal과 context.User가 모두 'principal'과 동일한 인스턴스인지 여부를 알려줄 것을 권한다. – chiccodoro

답변

1

이전에 asp.net 회원 API를 사용했다고 생각합니다. 이제 응용 프로그램에 사용자 지정 사용자 지정을 만들려고합니다.

서버에 요청을 보내면 서버는 새로운 깨끗한 HttpContext를 사용합니다. 그래서 당신은 옛 정보를 잃어 버렸습니다. 이전 세션 정보를 응용 프로그램으로 사용하려면 서버 또는 클라이언트 측에 데이터를 저장해야합니다. 이것을 두 가지 방법으로 할 수 있습니다.

  • 클라이언트 쿠키
  • 서버 세션

난 당신이 클라이언트 쿠키를 사용하는 운영자 추천. 데이터가 클라이언트 측에 저장되므로 서버 리소스가 절약됩니다.

public void SetCredentials(HttpContextBase context, string username, bool createPersistenceCookie) 
    { 
     var formsAuthenticationTicket = new FormsAuthenticationTicket(
      1, 
      username, 
      DateTime.Now, 
      DateTime.Now.AddMilliseconds(FormsAuthentication.Timeout.TotalMilliseconds), 
      createPersistenceCookie, 
      roles 
     ); 

     var encryptedTicket = FormsAuthentication.Encrypt(formsAuthenticationTicket); 
     var authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket); 

     HttpContext.Current.Response.AppendCookie(authCookie); 
    } 

클라이언트 측에 암호화 된 쿠키를 보냈습니다. 그리고이 쿠키를 서버 응용 프로그램에 들어오는 요청을 모두 확인해야합니다.

그리고 지금 Global.asax에 파일

:

protected void Application_AuthenticateRequest(object sender, System.EventArgs e) 
    { 
     HttpCookie authCookie = Request.Cookies[FormsAuthentication.FormsCookieName]; 

     if (authCookie == null) return; 

     FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(authCookie.Value); 

     IIdentity identity = new GenericIdentity(ticket.Name); 
     IPrincipal principal = new GenericPrincipal(identity, ticket.UserData.Split('|')); 

     HttpContext.Current.User = principal; 
    } 

나는 당신의 문제를 해결할 수 있기를 바랍니다.

관련 문제