【问题标题】:Adding features to ServiceStack auth provider向 ServiceStack 身份验证提供程序添加功能
【发布时间】:2013-03-11 09:56:53
【问题描述】:

我正在使用 OrmLite 评估 ServiceStack。内置的 Auth 服务以及 Session 和 Cache 比 ASP.NET 会员提供者要好得多。

但是,开箱即用的身份验证服务不提供我们想要构建的应用所需的一些功能,例如:

  • 修改密码
  • 在 3 次登录尝试失败后锁定帐户
  • 禁用用户帐户
  • 密码提示问答
  • 审核登录尝试日志

我是否需要构建自定义身份验证提供程序,或者是否有已经提供此功能的东西?

非常感谢!

【问题讨论】:

    标签: servicestack ormlite-servicestack


    【解决方案1】:

    我刚刚开始实施密码重置,并且可以看到两种实现方法(我还没有测试过 - 甚至没有尝试过):

    1.创建一个继承自Registration并处理PUT的类。然后应该可以调用注册类的 UpdateUserAuth 方法来更改密码。问题 - 对我来说 - 这里是 put 验证需要指定用户名和密码,而不仅仅是一个(我们只使用电子邮件作为标识符)。这可以通过关闭验证功能来解决。

    2.创建一个密码重置服务,该服务执行 UpdateUserAuth 所做的操作。

    var session = this.GetSession();
    var existingUser = UserAuthRepo.GetUserAuth(session, null);
    if (existingUser == null)
    {
        throw HttpError.NotFound("User does not exist");
    }
    
    var newUserAuth = ToUserAuth(request);
    UserAuthRepo.UpdateUserAuth(newUserAuth, existingUser, request.Password);
    

    显然需要在里面添加一些适当的验证。

    更新

    我已将更改密码提醒/重置服务设置为 gist(我的第一个要点!)

    【讨论】:

    • 我认为对于帐户锁定和帐户禁用我会扩展凭据身份验证提供程序。可能使用缓存提供程序来存储无效的登录尝试,如果它们都是基于时间的,则可能会锁定/禁用。
    • 如果你把它写成一个特性,然后向服务堆栈提交一个拉取请求,我们都可以使用它!
    • 是的,我正在研究代码以确定完成此操作所需的最小可能更改。目前,看来我将不得不创建一项新服务。我不确定是否要担心开放身份验证提供程序,因为它们无法提供与凭据提供程序相同级别的功能。
    【解决方案2】:

    这就是我所做的,效果很好。 - 我意识到“新”是一种代码气味,只需注入它 :)

            private int LoginAttempts = 0;
    
        public override bool TryAuthenticate(IServiceBase authService, string userName, string password)
        {
            var authRepo = authService.TryResolve<IUserAuthRepository>();
    
            if (authRepo == null)
            {
                Log.WarnFormat("Tried to authenticate without a registered IUserAuthRepository");
                return false;
            }
    
    
            var session = authService.GetSession();
    
            UserAuth userAuth = null;
    
            if (authRepo.TryAuthenticate(userName, password, out userAuth))
            {
                session.PopulateWith(userAuth);
    
                session.IsAuthenticated = true;
    
                session.UserAuthId = userAuth.Id.ToString(CultureInfo.InvariantCulture);
    
                session.ProviderOAuthAccess = authRepo.GetUserOAuthProviders(session.UserAuthId)
                    .ConvertAll(x => (IOAuthTokens)x);
    
    
                return true;
            }
            else
            {
                LoginAttempts++;
    
                if (LoginAttempts >= 3)
                {
                    ServiceStack.ServiceInterface.Service s = new Service();
    
                    s.Db.ExecuteSql("update [User] set AccountLocked = 'true' where Email='" + userName + "'");
                }
    
                authService.RemoveSession();
                return false;
            }
        }
    

    而且我希望 mod_from_hell 设法不理会这个!!!

    【讨论】:

    • 恐怕您正在做的严重错误会使您的应用程序处于危险之中: - LoginAttempts 变量对于您的整个应用程序都是全局的。如果更多用户同时输入错误密码会怎样?尝试成功后是否重置计数器? - 你正在使用带有未转义数据的 sql,这是一个重大漏洞,因为它可以用于 SQL 注入
    猜你喜欢
    • 2018-05-21
    • 2013-11-15
    • 2017-12-25
    • 2015-08-24
    • 2020-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多