2012-04-17 32 views
5

Tôi đang cố gắng làm theo ví dụ Nancy.Demo.Authentication.Forms nhưng tôi đang gặp sự cố vì có vẻ như mã ví dụ đã lỗi thời. Tôi xin lỗi nếu câu hỏi này là dài nhưng tôi không muốn bỏ lỡ những sai lầm của tôi. Vì vậy, đây là những gì tôi đã làm cho đến nay:Nancy: FormsAuthentication - Bắt đầu

Tôi đã cài đặt thành công gói xác thực qua trình quản lý gói giao diện điều khiển (VS11 beta)

PM> install-package nancy.Authentication.Forms 
Attempting to resolve dependency 'Nancy (= 0.10.0)'. 
Successfully installed 'Nancy.Authentication.Forms 0.10.0'. 
Successfully added 'Nancy.Authentication.Forms 0.10.0' to uMentor. 

tôi đã viết một thực hiện IUserMapper mà phải mất một sự phụ thuộc vào phiên RavenDB của tôi nhà cung cấp và sử dụng đó để tìm và xác nhận người dùng

public class FormsAuthenticationService : IUserMapper 
{ 
    private readonly IRavenSessionProvider _ravenSessionProvider; 

    public FormsAuthenticationService(IRavenSessionProvider ravenSessionProvider) 
    { 
     _ravenSessionProvider = ravenSessionProvider; 
    } 

    public IUserIdentity GetUserFromIdentifier(Guid identifier) 
    { 
     using (var ravenDB = _ravenSessionProvider.GetSession()) 
     { 
      var user = ravenDB.Query<User>().FirstOrDefault(u => u.FormsAuthenticationGuid == identifier); 
      return user; 
     } 
    } 

    public static Guid? ValidateUser(IDocumentSession ravenDB, string username, string password) 
    { 
     var user = ravenDB.Query<User>().FirstOrDefault(u => u.UserName == username && u.Password == password); 
     if (user == null) 
     { 
      return null; 
     } 
     return user.FormsAuthenticationGuid; 
    } 
} 

tôi đã thêm một tài sản để lớp người dùng của tôi để phục vụ cho các lĩnh vực nhận dạng Guid cần thiết để làm cho các tập tin cookie an toàn hơn (tôi đã đọc bài viết grumpydev và hiểu tại sao thứ được Guid là cần thiết, nhưng nó thực hành tốt để làm điều này một lĩnh vực bất động sản trên lớp người dùng?)

public class User : IUserIdentity 
{ 
    public string UserName { get; set; } 
    public IEnumerable<string> Claims { get; set; } 
    public string Email { get; set; } 
    public string Password { get; set; } 
    public Guid FormsAuthenticationGuid { get; set; } 
} 

Cuối cùng tôi đã thêm thiết lập hơn để bootstrapper của tôi bằng cách ăn cắp mã trực tiếp ra khỏi Demo (liên kết ở trên). Đây là nơi tôi đang gặp vấn đề. Mã dường như đã thay đổi.

public class MyBootstrapper : DefaultNancyBootstrapper 
{ 
    protected override void ConfigureRequestContainer(TinyIoCContainer container, NancyContext context) 
    { 
     base.ConfigureRequestContainer(container, context); 
     container.Register<IUserMapper, FormsAuthenticationService>(); 
    } 

    protected override void RequestStartup(TinyIoCContainer requestContainer, IPipelines pipelines, NancyContext context) 
    { 
     var formsAuthConfiguration = 
      new FormsAuthenticationConfiguration() 
      { 
       //These properties do not exist! <<---- Edit - yes they do - see comment 
       RedirectUrl = "~/login", 
       UserMapper = requestContainer.Resolve<IUserMapper>(), 
      }; 
     //This method does not exist <<---- Edit - yes they do - see comment 
     FormsAuthentication.Enable(pipelines, formsAuthConfiguration); 
    } 

    protected override NancyInternalConfiguration InternalConfiguration 
    { 
     get { return NancyInternalConfiguration.WithOverrides(x => x.NancyModuleBuilder = typeof(RavenAwareModuleBuilder)); } 
    } 
} 

EDIT 1 Hóa ra sai lầm của tôi là ngớ ngẩn (một using tuyên bố không chính xác - xem bình luận dưới đây). Tất cả các mã trên bây giờ chỉ hoạt động tốt vì vậy tôi sẽ để lại câu hỏi này đứng.

+0

Gotcha! OK, tôi đã tìm thấy sự cố với mã bị hỏng. Resharper helpfully đưa vào sau bằng cách sử dụng tuyên bố: 'using FormsAuthenticationConfiguration = System.Web.Configuration.FormsAuthenticationConfiguration;'. Loại bỏ điều này giải quyết các mã bị hỏng :-) Tuy nhiên tôi vẫn sẽ chào đón bất kỳ ý kiến ​​về việc thực hiện của tôi. Tôi cần đảm bảo rằng tôi đang đi đúng hướng. Cảm ơn. – biofractal

+0

My Nancy FormsAuthentication với RavenDB bây giờ tất cả các công trình. Mặc dù tôi đã đi vòng quanh nhà chỉ để tôi có thể cắn đuôi của riêng tôi, tôi sẽ để lại câu hỏi này đứng vì nó có thể giúp đỡ người khác. – biofractal

Trả lời

1

Chỉ trong trường hợp bạn bỏ lỡ những nhận xét trên, câu trả lời là thảm hại đơn giản:

Gotcha! OK, tôi đã tìm thấy sự cố với mã bị hỏng. Resharper helpfully đưa vào sau đây bằng cách sử dụng tuyên bố: 'sử dụng FormsAuthenticationConfiguration = System.Web.Configuration.FormsAuthenticationConfiguration;'. Loại bỏ này giải quyết các mã bị hỏng :-) Tuy nhiên tôi vẫn sẽ chào đón bất kỳ ý kiến ​​về việc thực hiện của tôi. Tôi cần đảm bảo rằng tôi đang ở trên đường dẫn bên phải .