我正在使用NancyFx制作一个简单的网站,用户可以使用 ajax 控件登录和退出。
我已经阅读了有关Nancy 表单身份验证的文档,并且我认为我已经完成了所有必需的步骤。
- 安装 Nancy.Authentication.Forms 包
- 实现 IUserMapper
- 实现路由来处理登录和注销
- 配置和启用表单身份验证
我遇到一个问题,在调用登录后,请求没有当前用户集。执行登录后,我可以看到一个 cookie 集。然而,用户映射器没有被调用。我尝试使用和不使用 this.RequiresAuthentication(); 请求路由 仍然没有用户。
这是我的第 4 步的引导程序实现
public class Bootstrapper : DefaultNancyBootstrapper
{
protected override void ConfigureApplicationContainer(TinyIoCContainer container)
{
container.Register<ISessionFactory>((c, p) => SessionFactory.Factory);
}
protected override void ConfigureConventions(NancyConventions conventions)
{
base.ConfigureConventions(conventions);
conventions.StaticContentsConventions.Add(StaticContentConventionBuilder.AddDirectory("assets", @"content/assets"));
conventions.StaticContentsConventions.Add(StaticContentConventionBuilder.AddDirectory("application", @"content/application"));
}
protected override void ConfigureRequestContainer(TinyIoCContainer container, NancyContext context)
{
base.ConfigureRequestContainer(container, context);
container.Register<IUserMapper, UserMapper>();
}
protected override void RequestStartup(TinyIoCContainer container, IPipelines pipelines, NancyContext context)
{
base.RequestStartup(container, pipelines, context);
var formsAuthConfiguration =
new FormsAuthenticationConfiguration()
{
RedirectUrl = "~/",
UserMapper = container.Resolve<IUserMapper>()
};
FormsAuthentication.Enable(pipelines, formsAuthConfiguration);
}
}
这是我第 3 步的登录和注销逻辑。
Post["/login"] = x =>
{
//Verify here, hardcode for testing
string email = "test@example.com";
User user = ExecuteCommand(new FetchUser(email));
this.LoginWithoutRedirect(user.Session);
return new { email = user.Email, authorized = true, status = "okay" };
};
Post["/logout"] = x =>
{
return this.Logout("~/");
};
我的 IUsermapper 只是从具有给定 ID 的数据库中查找用户。我可以看到它是在 RequestStartup 解析 IUserMapper 时构建的,但是从来没有对 getUserFromIdentifier 函数进行任何调用。
任何帮助都会很棒。