public void Should_remember_me()
        {
            const string userName = "******";
            const string password = "******";

            var identity = _identityDirectory.CreateIdentity();
            var success  = _identityStore.AddCredentials(identity, userName, password);

            Assert.IsTrue(success);

            var result = _identityStore.AuthenticateWithCredentials(userName, password);

            Assert.IsNotNull(result);
            Assert.AreEqual(identity, result.Identity);
            Assert.AreEqual(AuthenticationStatus.Authenticated, result.Status);

            var result2 = _identityStore.RememberMe(result.RememberMeToken);

            Assert.IsNotNull(result2);
            Assert.AreEqual(identity, result2.Identity);
            Assert.AreEqual(AuthenticationStatus.Authenticated, result2.Status);
        }
        public Task RouteRequest(IOwinContext context, Func <Task> next)
        {
            var cookie = context.Request.Cookies[IdentityCookie];

            if (cookie == null)
            {
                cookie = string.Empty;
                var rememberMe = context.Request.Cookies[RememberMeCookie];
                if (rememberMe != null)
                {
                    var authenticationResult = _identityStore.RememberMe(rememberMe);
                    if (authenticationResult.Status == AuthenticationStatus.Authenticated)
                    {
                        context.Response.Cookies.Append(IdentityCookie, authenticationResult.Identity);
                        cookie = authenticationResult.Identity;
                    }
                    SetAuthentication(context, authenticationResult);
                }
            }
            var identification = new Identification(cookie, _identityDirectory.GetClaims(cookie));

            context.SetFeature <IIdentification>(identification);
            context.SetFeature <IUpstreamIdentification>(identification);

            if (string.Equals(SecureHomePage, context.Request.Path.Value, StringComparison.OrdinalIgnoreCase))
            {
                identification.AllowAnonymous = true;
            }

            if (string.Equals("POST", context.Request.Method, StringComparison.OrdinalIgnoreCase))
            {
                var path = context.Request.Path.Value;

                if (string.Equals(LoginPostback, path, StringComparison.OrdinalIgnoreCase))
                {
                    Login(context, identification);
                    return(context.Response.WriteAsync(string.Empty));
                }

                if (string.Equals(LogoutPostback, path, StringComparison.OrdinalIgnoreCase))
                {
                    Logout(context, identification);
                    return(context.Response.WriteAsync(string.Empty));
                }

                if (string.Equals(RegisterPostback, path, StringComparison.OrdinalIgnoreCase))
                {
                    Register(context, identification);
                    return(context.Response.WriteAsync(string.Empty));
                }

                if (string.Equals(EndSessionPostback, path, StringComparison.OrdinalIgnoreCase))
                {
                    EndSession(context, identification);
                    return(context.Response.WriteAsync(string.Empty));
                }

                if (string.Equals(ChangePasswordPostback, path, StringComparison.OrdinalIgnoreCase))
                {
                    ChangePassword(context, identification);
                    return(context.Response.WriteAsync(string.Empty));
                }

                if (string.Equals(RequestPasswordResetPostback, path, StringComparison.OrdinalIgnoreCase))
                {
                    SendPasswordReset(context, identification);
                    return(context.Response.WriteAsync(string.Empty));
                }

                if (string.Equals(ResetPasswordPostback, path, StringComparison.OrdinalIgnoreCase))
                {
                    ResetPassword(context, identification);
                    return(context.Response.WriteAsync(string.Empty));
                }
            }

            return(next());
        }