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