6

Nancy.Demo.Authentication.Formsの例に従おうとしていますが、サンプル コードが古くなっているように見えるため、問題が発生しています。この質問が長い場合は申し訳ありませんが、間違いを見逃したくありません。だからここに私がこれまでにやったことがあります:

パッケージ マネージャー コンソール (VS11 ベータ版) を使用して認証パッケージを正常にインストールしました

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.

RavenDB セッション プロバイダーに依存し、それを使用してユーザーを見つけて検証する IUserMapper の実装を作成しました。

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

Cookie をより安全にするために必要な Guid 識別子フィールドに対応するために、User クラスにプロパティを追加しました (grumpydev の投稿を読んで、この Guid が必要な理由を理解しましたが、これをユーザークラス?)

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

最後に、デモからコードを直接盗むことで、ブートストラップにさらにセットアップを追加しました (上記のリンク)。これは私が問題を抱えているところです。コードが変更されたようです。

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 私の間違いはばかげていることがわかりました(間違ったusing声明 - 以下のコメントを参照してください)。上記のコードはすべて正常に機能するようになったため、この質問はそのままにしておきます。

4

1 に答える 1

1

Just in case you missed the comment above, the answer was pathetically simple:

Gotcha! OK, I found the problem with the broken code. Resharper helpfully put in the following using statement: 'using FormsAuthenticationConfiguration = System.Web.Configuration.FormsAuthenticationConfiguration;'. Removing this solved the broken code :-) However I would still welcome any comments about my implementation. I need reassurance that I am on the right path.

于 2012-08-28T09:03:29.350 に答える