在 servicestack OAuth 实现中,我只看到了自动登录的可能性,例如。脸书账号。
但是否能够支持通过 Facebook 登录进行注册过程。我想要的是让用户登录到 facebook 应用程序,然后加载他们的姓名、姓氏和电子邮件,并预先填写所需的文本框以便在我的网站上进行真实注册(因为我还必须进行手机验证等)我不希望用户使用 facebook 登录时要获得授权和身份验证。只有凭据登录才应该是有效的完整站点访问权限。
Edit:我找到了解决方案。
在 FacebookProvider.cs 中
public override bool IsAuthorized(IAuthSession session, IOAuthTokens tokens, Auth request = null)
{
if (request != null)
{
if (!LoginMatchesSession(session, request.UserName)) return false;
}
return tokens != null && session.UserName!=null && !string.IsNullOrEmpty(tokens.AccessTokenSecret);
}
问题是&& session.UserName!=null部分。因此我们可以检查用户是否使用凭据登录,这将为 !=null 并且用户可以使用所有服务。如果不是,这将是 ==null 并且他只能从会话中获取 facebook 信息。
The 社交引导 API http://bootstrapapi.apphb.com项目显示了一个通过覆盖成功身份验证后处理回调的示例其自定义用户会话的 OnAuthenticated() 挂钩 https://github.com/ServiceStack/SocialBootstrapApi/blob/master/src/SocialBootstrapApi/Models/CustomUserSession.cs:
我删除、重写了一些内容并强调了一些重要的部分:
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 并自动为您填充会话。如果您想添加额外的验证断言,您可以简单地使用您自己的自定义 [Authentication] 属性,而不是包含其他自定义逻辑。看一下内置的实现验证属性作为指导 https://github.com/ServiceStack/ServiceStack/blob/master/src/ServiceStack.ServiceInterface/AuthenticateAttribute.cs.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)