3

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

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

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

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

非常感谢!

4

2 回答 2

1

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

        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 设法不理会这个!

于 2013-04-23T19:37:15.943 回答
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);

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

更新

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

于 2013-03-11T16:30:17.117 回答