南希:FormsAuthentication - 入门

时间:2012-04-17 10:45:13

标签: forms-authentication nancy

我正在尝试关注Nancy.Demo.Authentication.Forms示例,但我遇到了问题,因为示例代码现在已经过时了。如果这个问题很长,我很抱歉,但我不想错过我的错误。所以这就是我到目前为止所做的:

我通过包管理器控制台(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.

我写了一个IUserMapper的实现,它依赖于我的RavenDB会话提供程序并使用它来查找和验证用户

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;
    }
}

我已经在我的User类中添加了一个属性,以满足使cookie更安全所需的Guid标识符字段(我已经阅读了grumpydev的帖子并理解为什么需要这个Guid,但这是一个很好的做法,使这个属性User类上的字段?)

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; }
}

最后,我通过直接从Demo(上面的链接)中窃取代码,为我的引导程序添加了更多设置。这是我遇到问题的地方。代码似乎已经改变。

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)); }
    }
}

编辑1 事实证明我的错误是愚蠢的(一个不正确的using声明 - 见下面的评论)。上面的所有代码现在都运行得很好,所以我会留下这个问题。

1 个答案:

答案 0 :(得分:1)

如果您错过了上述评论,答案很简单:

  

疑难杂症!好的,我发现代码损坏的问题。 ReSharper的   有用地提出以下使用声明:'使用   FormsAuthenticationConfiguration =   System.Web.Configuration.FormsAuthenticationConfiguration;”。删除   这解决了破碎的代码:-)然而我仍然欢迎任何   关于我的实施的评论。我需要保证我在上   正确的道路。