我正在使用OrmLite评估ServiceStack。内置的Auth服务以及Session和Cache比ASP.NET成员资格提供者要好得多。
但是,开箱即用的Auth服务不提供我们想要构建的应用程序所需的一些功能:
我是否需要构建自定义身份验证提供程序,或者是否存在已提供此功能的内容?
非常感谢!
答案 0 :(得分: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(我的第一个要点!)
答案 1 :(得分: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能够独自完成这一切!!!