将基于凭据的身份验证信息与OAuth链接

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表上的表中复制一些信息(例如,在新授权后的下次登录时),但为什么呢?该会话似乎已使用正确的数据初始化.