Nancy.Authentication.Forms中不记得登录名

本文关键字:记得 登录 Authentication Forms Nancy | 更新日期: 2023-09-27 18:25:51

在过去的几周里,我断断续续地处理这个问题,但现在我真的需要解决它,我似乎无法解决它。

简而言之:我有一个nancy应用程序,它启用了Forms Authentication。所有的工作都很好,除了会话在应用程序重新启动之间没有持久化,所以看起来是这样。这应该有效,因为Forms Authentication默认情况下使用cookie。你们知道造成这种行为的原因吗?这是我的代码:

引导程序.cs:

    protected override void RequestStartup(TinyIoCContainer container, IPipelines           pipelines, NancyContext context)
    {
        base.RequestStartup(container, pipelines, context);
            var formsAuthConfiguration = new FormsAuthenticationConfiguration()
            {
                RedirectUrl = "~/user/login",
                UserMapper = container.Resolve<IUserMapper>()
            };
            FormsAuthentication.Enable(pipelines, formsAuthConfiguration);
    }

以及在应用程序启动中:

    protected override void ApplicationStartup(TinyIoCContainer container, IPipelines pipelines)
    {
        base.ApplicationStartup(container, pipelines);
        Nancy.Session.CookieBasedSessions.Enable(pipelines);
        //Nancy.Session.MemoryCacheBasedSessions.Enable(pipelines); <-- disabled just to be sure
        Nancy.Json.JsonSettings.RetainCasing = true;
        Nancy.Json.JsonSettings.MaxJsonLength = Int32.MaxValue;
        StaticConfiguration.DisableErrorTraces = false;
        Elmahlogging.Enable(pipelines, "elmah");
        //Some background job initialization...
    }

het模块中处理登录/POST请求的路由:

        Post["/login"] = parameters =>
        {
            VerifyUserViewModel userLoginData = this.Bind();
            var verified = userManager.VerifyAccount(userLoginData.Email, userLoginData.Password);
            userLoginData.LoginFailed = false;
            if (verified == false)
            {
                userLoginData.LoginFailed = true;
                return View["SignIn", userLoginData];
            }
            else
            {
                var user = userManager.GetByEmail((string)Request.Form.Email);
                DateTime? expiry = null;
                if (this.Request.Form.RememberMe.HasValue)
                {
                    expiry = DateTime.Now.AddDays(30);
                }
                return this.LoginAndRedirect(user.Guid, expiry, "/dash");
            }
        };

最后,IUserMapper实现:

public class UserDatabase : IUserMapper
{
    private readonly IUserManager _userManager;
    public UserDatabase(IUserManager userManager)
    {
        _userManager = userManager;
    }
    public Nancy.Security.IUserIdentity GetUserFromIdentifier(Guid identifier, Nancy.NancyContext context)
    {
        var user = (ReflectUser)_userManager.GetByGuid(identifier);
        var identity = new ReflectWebUser();
        identity.Map(user);
        return identity;
    }
}

你们注意到我的代码有什么奇怪的地方会阻碍会话持久性吗?

请注意,我也在这个应用程序中使用基于令牌的身份验证,但我已经完全禁用了它进行测试。此外,这个问题在实现令牌身份验证之前就已经存在。

谢谢!

Nancy.Authentication.Forms中不记得登录名

如果链接失效。

问题是Nancy在应用程序启动时生成了一个加密密钥,这意味着当你在开发过程中重建应用程序并重新请求页面时,cookie检查将失败并被删除,导致用户看起来未经验证。

如果IIS被回收,应用程序将重新启动,生成新密钥,bam用户将注销,也会发生同样的情况。

解决方案是自己生成一个特定的密钥。配置Forms Auth时,您可以创建自己的加密配置:

var cryptographyConfiguration = new CryptographyConfiguration(
    new RijndaelEncryptionProvider(new PassphraseKeyGenerator("SuperSecretPass", new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 })),
    new DefaultHmacProvider(new PassphraseKeyGenerator("UberSuperSecure", new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 })));
var config = 
    new FormsAuthenticationConfiguration()
    {
        CryptographyConfiguration = cryptographyConfiguration,
        RedirectUrl = "/login",
        UserMapper = container.Resolve<IUserMapper>(),
    };

这将在开发和应用程序回收期间保持登录。