2

私はNancyFxを使用して、ユーザーが ajax コントロールを使用してログインおよびログアウトできる単純な Web サイトを作成しています。

Nancy によるフォーム認証に関するドキュメントを読み、必要な手順をすべて完了したと思います。

  1. Nancy.Authentication.Forms パッケージをインストールする
  2. IUserMapper を実装する
  3. ログインとログアウトを処理するルートを実装する
  4. フォーム認証を構成して有効にする

ログインを呼び出した後、リクエストに現在のユーザーが設定されていないという問題があります。ログインが実行された後に設定された Cookie を確認できます。ただし、ユーザー マッパーは呼び出されません。this.RequiresAuthentication(); を使用して、または使用せずにルートをリクエストしようとしました。まだユーザーがいません。

ステップ 4 の Bootstrapper の実装は次のとおりです。

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 を解決するときに構築されることがわかりますが、get GetUserFromIdentifier 関数への呼び出しはありません。

どんな助けでも素晴らしいでしょう。

4

1 に答える 1

1

拡張機能を使用しているため、GetUserFromIdentifierメソッドは呼び出されていません。LoginWithoutRedirect呼び出すのはログインではGetUserFromIdentifierなく、後続のリダイレクトです。

物事を行うより一般的な方法は次のとおりです。

string email = "test@example.com";
User user = ExecuteCommand(new FetchUser(email));
this.LoginAndRedirect(user.Session);

ログインルートに直接アクセスすることは想定されていません。代わりに、ユーザーは通常、保護されたリソースを要求し、認証されてから、要求されたリソースにリダイレクトされます。

その他のポイント:

あなたのコードを試したところ、匿名型を返すエラーが発生しました。代わりに、次のように型を json として返す必要がありました。

this.LoginWithoutRedirect(user.Session);
return Response.AsJson(new
{
    email = user.Email,
    authorized = true,
    status = "okay"
});

これは正常に動作し、ログインして匿名型を json オブジェクトとして返します。リダイレクトがないため、予想どおり、 は呼び出されませんGetUserFromIdentifier

最後に、/logoutルートは を使用して保護する必要がありますthis.RequiresAuthentication()。認証されたユーザーのみがログアウトする必要があるため、これは理にかなっています。GetUserFromIdentifierおそらくキャッシュされたユーザーがタイムアウトしたために null が返された場合にも保護 されます。RequiresAuthenticationはこの null ユーザーを検出し、 にリダイレクトしGet["/login"]ます。

于 2013-06-04T15:27:22.427 に答える