SocialBootstrap API项目显示了通过覆盖其自定义用户会话的 OnAuthenticated() 挂钩来处理成功身份验证后的回调的示例:
我已经退出,重写了一些并突出了一些重要的部分:
public class CustomUserSession : AuthUserSession
{
public override void OnAuthenticated(IServiceBase authService,
IAuthSession session,
IOAuthTokens tokens,
Dictionary<string, string> authInfo)
{
base.OnAuthenticated(authService, session, tokens, authInfo);
//Populate matching fields from this session into your own MyUserTable
var user = session.TranslateTo<MyUserTable>();
user.Id = int.Parse(session.UserAuthId);
user.GravatarImageUrl64 = CreateGravatarUrl(session.Email, 64);
foreach (var authToken in session.ProviderOAuthAccess)
{
if (authToken.Provider == FacebookAuthProvider.Name)
{
user.FacebookName = authToken.DisplayName;
user.FacebookFirstName = authToken.FirstName;
user.FacebookLastName = authToken.LastName;
user.FacebookEmail = authToken.Email;
}
else if (authToken.Provider == TwitterAuthProvider.Name)
{
user.TwitterName = authToken.DisplayName;
}
}
//Resolve the DbFactory from the IOC and persist the user info
using (var db = authService.TryResolve<IDbConnectionFactory>().Open())
{
//Update (if exists) or insert populated data into 'MyUserTable'
db.Save(user);
}
}
//Change `IsAuthorized` to only verify users authenticated with Credentials
public override bool IsAuthorized(string provider)
{
if (provider != AuthService.CredentialsProvider) return false;
return base.IsAuthorized(provider);
}
}
基本上,这个用户定义的自定义逻辑(每次成功验证后都会触发)从 UserSession 中提取数据并将其存储在自定义的“MyUserTable”中。
我们还覆盖了IsAuthorized
仅接受已通过 CredentialsAuth 进行身份验证的用户的含义。
您可以使用这些数据来完成其余的注册。
其他可能的自定义
ServiceStack 的内置 Auth 持久化 AuthData 并自动为您填充 Session。如果您想添加额外的验证断言,您可以简单地使用您自己的自定义 [Authentication] 属性,而不是包含额外的自定义逻辑。查看内置AuthenticateAttribute 的实现作为指南。