2014-05-19 29 views
1

我工作的一个Web应用程序将同时拥有凭证和的oauth2(谷歌/ LinkedIn)认证/授权。用户将由管理员和给予的凭证进行注册。 此外,一旦注册的用户也可以通过oauth2进行身份验证。与谷歌的Oauth ServiceStack授权,只有已注册为凭据用户

的问题是,供应商的oauth2与谷歌/ LinkedIn,如果认证成功将授权尽管不存在于所有的用户在网站上的请求。他们自动为存储库中的UserAuth和UserAuthDetail创建记录。

有没有办法覆盖此默认行为,而检查用户是否存在?

在此先感谢

回答

2

OAuth提供程序按照您描述的方式工作。如果用户对网站不熟悉,又不想发明和记住另一个密码,他/她可以选择使用可用的OAuth提供程序,ServieStack将为他/她创建用户帐户。

如果现有的用户,谁使用凭据提供登录到该网站,决定通过OAuth的供应商登录有两种可能的情况:

  1. 如果用户IS NOT登录并使用OAuth提供商,然后新的用户帐户将被创建
  2. 如果用户IS登录并使用OAuth提供者,那么现有的帐户将被绑定到这个OAuth的提供商。

如果你需要重写这一点,你可以继承GoogleOAuth2Provider和覆盖SaveUserAuth它默认使用IUserAuthRepository.CreateOrMergeAuthSession()

+0

感谢您的答复,我会去子类的OAuth的提供商,反正我相信它会对IUserAuthRepository.CreateOrMergeAuthSession()有用,它有一个参数,指示是否应该创建新用户(如果不存在)。 – gjspaho

+0

嗨,它看起来像在[AuthProvider.cs(https://github.com/ServiceStack/ServiceStack/blob/master/src/ServiceStack/Auth/AuthProvider.cs),SaveUserAuth不会被调用,它已被注释掉在OnAuthenticated'如果(令牌!= NULL){ authInfo.ForEach((X,Y)=> tokens.Items [X] = Y); session.UserAuthId = authRepo.CreateOrMergeAuthSession(session,tokens); } // SaveUserAuth(authService,userSession,authRepo,tokens);' – gjspaho

+0

你好。那么你不需要SaveUserAuth :)相反,重写OnAuthenticated并重新使用一些基类代码来实现你需要的确切行为。 – iamruss