2014-10-07 2 views
2

지난 몇 주 동안이 문제를 반복적으로 처리하고 있지만 이제는 문제를 해결해야합니다. 문제는 해결할 수없는 것 같습니다.Nancy.Authentication.Forms에 로그인이 기억되지 않습니까?

간단히 말해서 : 나는 폼 인증을 사용하는 nancy 앱이 있습니다. 모든 작품 괜찮아 세션이 애플 리케이션 재시작 사이에 지속되지 않습니다 기대, 그래서 보인다. 폼 인증은 기본적으로 쿠키를 사용하기 때문에 이렇게해야합니다. 당신들은이 행동을 일으킬 수있는 어떤 생각이 있습니까?

Bootstrapper.cs :

protected override void RequestStartup(TinyIoCContainer container, IPipelines   pipelines, NancyContext context) 
    { 
     base.RequestStartup(container, pipelines, context); 
      var formsAuthConfiguration = new FormsAuthenticationConfiguration() 
      { 
       RedirectUrl = "~/user/login", 
       UserMapper = container.Resolve<IUserMapper>() 
      }; 
      FormsAuthentication.Enable(pipelines, formsAuthConfiguration); 
    } 

앱 시작에 : 여기 내 코드는

protected override void ApplicationStartup(TinyIoCContainer container, IPipelines pipelines) 
    { 
     base.ApplicationStartup(container, pipelines); 
     Nancy.Session.CookieBasedSessions.Enable(pipelines); 
     //Nancy.Session.MemoryCacheBasedSessions.Enable(pipelines); <-- disabled just to be sure 
     Nancy.Json.JsonSettings.RetainCasing = true; 
     Nancy.Json.JsonSettings.MaxJsonLength = Int32.MaxValue; 
     StaticConfiguration.DisableErrorTraces = false; 
     Elmahlogging.Enable(pipelines, "elmah"); 
     //Some background job initialization... 
    } 

로그인/POST 요청 처리 HET 모듈 경로 :

 Post["/login"] = parameters => 
     { 
      VerifyUserViewModel userLoginData = this.Bind(); 
      var verified = userManager.VerifyAccount(userLoginData.Email, userLoginData.Password); 
      userLoginData.LoginFailed = false; 
      if (verified == false) 
      { 
       userLoginData.LoginFailed = true; 
       return View["SignIn", userLoginData]; 
      } 
      else 
      { 
       var user = userManager.GetByEmail((string)Request.Form.Email); 
       DateTime? expiry = null; 
       if (this.Request.Form.RememberMe.HasValue) 
       { 
        expiry = DateTime.Now.AddDays(30); 
       } 
       return this.LoginAndRedirect(user.Guid, expiry, "/dash"); 
      } 
     }; 

마지막으로, IUserMapper 구현 :

public class UserDatabase : IUserMapper 
{ 
    private readonly IUserManager _userManager; 
    public UserDatabase(IUserManager userManager) 
    { 
     _userManager = userManager; 
    } 

    public Nancy.Security.IUserIdentity GetUserFromIdentifier(Guid identifier, Nancy.NancyContext context) 
    { 
     var user = (ReflectUser)_userManager.GetByGuid(identifier); 
     var identity = new ReflectWebUser(); 
     identity.Map(user); 
     return identity; 
    } 
} 

여러분은 세션 지속성을 저해 할 수있는 내 코드가 이상하다는 것을 알 수 있습니까?

또한이 응용 프로그램에서는 토큰 기반 인증을 사용하고 있지만 테스트를 위해 완전히 비활성화되었습니다. 또한 토큰 인증을 구현하기 전에이 문제가있었습니다.

감사합니다.

+0

이 페이지 하단의 해결책은 https://github.com/NancyFx/Nancy/wiki/Forms-Authentication을 찾으십시오. – Corstiaan

답변

4

링크가 끊어집니다.

Nancy는 응용 프로그램이 시작될 때 암호 키를 생성합니다. 즉, 개발 중에 응용 프로그램을 다시 작성하고 페이지를 다시 요청하면 쿠키 검사가 실패하고 제거되어 사용자가 인증되지 않은 것처럼 보입니다.

IIS가 재활용되면 응용 프로그램이 다시 시작되고 새 키가 생성되고 사용자가 로그 아웃되는 경우에도 마찬가지입니다.

해결 방법은 특정 키를 직접 생성하는 것입니다. 양식 인증을 구성 할 때 자신 만의 암호화 구성을 만들 수 있습니다.

var cryptographyConfiguration = new CryptographyConfiguration(
    new RijndaelEncryptionProvider(new PassphraseKeyGenerator("SuperSecretPass", new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 })), 
    new DefaultHmacProvider(new PassphraseKeyGenerator("UberSuperSecure", new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 }))); 

var config = 
    new FormsAuthenticationConfiguration() 
    { 
     CryptographyConfiguration = cryptographyConfiguration, 
     RedirectUrl = "/login", 
     UserMapper = container.Resolve<IUserMapper>(), 
    }; 

이렇게하면 개발 및 응용 프로그램을 재활용하는 동안 로그인이 유지됩니다.

관련 문제