我正在尝试扩展 Service Stack 的身份验证和注册功能。我的身份验证和注册工作正常,但是我需要为每个用户添加一些自定义数据。从 Service Stack 的文档和其他各种帖子中,我发现您可以使用 UserAuth 表中内置的 MetaData 列添加自己的数据。
我创建了一个 CustomAuthRepository,所以我可以设置 UserAuth 的元数据属性,这是我的自定义 repo:
public class CustomAuthRepository : OrmLiteAuthRepository, IUserAuthRepository
{
public UserAuth CreateUserAuth(UserAuth newUser, string password)
{
newUser.Set(new LoginInfo
{
IsActive = false,
PasswordNeedsReset = true
});
return base.CreateUserAuth(newUser, password);
}
}
这对于设置元数据非常有用,我最终在 UserAuth 表的元数据列中得到了 LoginInfo 对象的序列化版本。
现在我要做的是当用户进行身份验证时,我需要根据一些元数据更改 AuthResponse。例如,如果用户尚未激活,我想返回一个带有属性的 AuthResponseIsActive = get value from custom meta data
如果我可以将自定义元数据放入 AuthSession,我想我可以做到这一点。这样,在我的自定义凭据身份验证提供程序中,我可以根据 AuthSession 中的内容更改响应对象:
public class CustomCredentialsAuthProvider : CredentialsAuthProvider
{
public override object Authenticate(IServiceBase authService, IAuthSession session, Auth request)
{
var customUserAuthSession = (CustomUserAuthSession)session;
if (!customUserAuthSession.LoginInfo.IsActive)
{
return new
{
UserName = customUserAuthSession.UserName,
IsActive = customUserAuthSession.LoginInfo.IsActive
};
}
var isAuthenticated = base.Authenticate(authService, session, request);
return isAuthenticated;
}
}
我是否以正确的方式进行此操作,还是有更好的方法来存储和检索自定义元数据?
如何根据用户的自定义元数据更改 AuthResponse?
如何将我的自定义元数据放入 AuthSession?
编辑 我越来越接近我想要做的事情。在我的 CustomAuthSession OnAuthenticated() 方法中:
public override void OnAuthenticated(IServiceBase authService, IAuthSession session, IOAuthTokens tokens, Dictionary<string, string> authInfo)
{
var customUserAuthSession = (CustomUserAuthSession) session;
var userAuth = authService.ResolveService<IUserAuthRepository>().GetUserAuth(session, null);
customUserAuthSession.LoginInfo = userAuth.Get<LoginInfo>();
authService.SaveSession(customUserAuthSession);
base.OnAuthenticated(authService, session, tokens, authInfo);
}
我正在重新获取 UserAuth 并使用我需要的数据填充会话。根据自定义用户会话的服务堆栈文档,您需要在使用一些自定义数据填充会话后保存会话。我正在这样做,但它似乎并没有节省。在我的 CustomCredentialsAuthProvider, Authenticate 方法中,我没有看到我添加到会话中的自定义数据。
编辑 我上面第一次编辑的问题是用户通过了身份验证,然后我们进入 CustomAuthSession 代码,我可以在其中检查它们是否处于活动状态。如果它们不活跃,我需要将它们注销,这并不理想。
相反,我发现我可以在自定义 CredentialsAuthProvider 的 Authenticate 方法中完成所有这些操作。
public override object Authenticate(IServiceBase authService, IAuthSession session, Auth request)
{
var userAuthRepo = authService.ResolveService<IUserAuthRepository>();
var userAuth = userAuthRepo.GetUserAuthByUserName(request.UserName);
var loginInfo = userAuth.Get<LoginInfo>();
if (!loginInfo.IsActive)
{
return new CustomAuthResponse
{
UserName = userAuth.UserName,
ResponseStatus = new ResponseStatus("500"),
IsActive = loginInfo.IsActive
};
}
var authResponse = (AuthResponse)base.Authenticate(authService, session, request);
return authResponse;
}
当请求进来时,我可以使用请求中的用户名来获取 UserAuth,并检查用户是否为 IsActive。如果不是,那么我可以在服务堆栈对它们进行身份验证之前返回一些错误。
我认为这对于我正在尝试做的事情来说已经足够了。我应该能够向客户端返回一个错误,说明用户不活跃。
如果有人有更清洁的方法来做到这一点,那就太好了。