Lor*_*tté 8 c# authentication oauth servicestack
我正在实现一个概念验证站点,可以选择与外部提供商链接.外部提供程序将用于获取一些其他用户数据.提供者方便地使用OAuth 1.0a公开身份验证.
要获取数据,用户在提供程序站点上进行身份验证并授予权限.简单.
该站点使用ServiceStack.用户使用注册和登录CredentialsAuthProvider.我查看了ServiceStack上的文档,探讨了SocialBoostrapApi演示,并相应地建模了我的服务;
首先,我添加了一个User类,它将序列化到我的数据库,以保存其他数据.
然后,我创建了一个CustomUserSession来覆盖该OnAuthenticated方法.
Plugins.Add(new AuthFeature(() => new CustomUserSession(), new IAuthProvider[] {
new CredentialsAuthProvider()
}));
Run Code Online (Sandbox Code Playgroud)
我的OnAuthenticated方法与SocialBoostrapApi演示中的方法非常相似; 它遍历session.ProviderOAuthAccess并从中获取必要的信息(寻找"ExternalProvider"提供者的OAuthTokens).
当然,这意味着当用户在外部提供商处授予我的应用程序授权时,在OAuth回调中,我会获得accessstoken,secret,everything,并将其放入其中session.ProviderOAuthAccess.
当然,这适用于当前会话,但如果用户再次注销,则必须再次授权(获取新的访问令牌).
我需要一些方法将我在会话中输入的数据保存到数据库中; 我试着环顾四周但却一无所获(另见我的问题).
所以,我添加了代码将它们直接保存到DB:
var userOAuthProvider = oauthTokens.TranslateTo<UserOAuthProvider>();
userOAuthProvider.UserAuthId = user.Id;
this.TryResolve<IDbConnectionFactory>().Run(db => db.Save(userOAuthProvider));
Run Code Online (Sandbox Code Playgroud)
现在,当用户进行身份验证时,似乎ServiceStack获取此UserAuthId的所有令牌并将其置于会话中.好!
我是以正确的方式做的吗?
我可以摆脱User/ CustomUserSessionclasses,只需将我需要的其他信息存储在UserOAuthProvider/ 中的"Items"字典中OAuthTokens吗?这会让我的代码更简单..
最后OnAuthenticate,SocialBootstrapApi再次保存自定义用户表:
authService.TryResolve<IDbConnectionFactory>().Run(db => db.Save(user));
Run Code Online (Sandbox Code Playgroud)
为什么有必要?我想是从UserOAuthProviderUser表上的表中复制一些信息(例如,在新授权后的下次登录时),但为什么呢?该会话似乎已使用正确的数据初始化.