2013-09-24 7 views
8

サービススタックの認証と登録機能を拡張しようとしています。私は、認証と登録がうまく動作しているが、私は各ユーザのカスタムデータを追加する必要がある。 Service Stackのドキュメントや他のさまざまな投稿から、UserAuthテーブルに組み込まれているMetaDataカラムを使用して独自のデータを追加できます。これは、メタデータを設定するための偉大な働いているサービススタック認証の拡張 - カスタムユーザー認証メタデータによるユーザーセッションの設定

public class CustomAuthRepository : OrmLiteAuthRepository, IUserAuthRepository 
{ 
    public UserAuth CreateUserAuth(UserAuth newUser, string password) 
    { 
     newUser.Set(new LoginInfo 
     { 
      IsActive = false, 
      PasswordNeedsReset = true 
     }); 
     return base.CreateUserAuth(newUser, password); 
    } 
} 

、私はシリアル化されたバージョンで終わる:

私はので、私はUSERAUTHのメタデータプロパティを設定することができCustomAuthRepositoryを作成したが、ここに私のカスタムレポですUserAuthテーブルのメタデータ列にあるLoginInfoオブジェクト。

私がしようとしているのは、ユーザーが認証したときに、そのメタデータの一部に基づいてAuthResponseを変更する必要がある場合です。たとえば、ユーザーがまだアクティブ化されていない場合は、プロパティ付きのAuthResponseを返すようにします。IsActive = get value from custom meta data

私は自分のカスタムメタデータをAuthSessionに取得できると思います。私はAuthSessionに何があるかに基づいて、レスポンスオブジェクトを変更することができ、私のカスタム資格認証プロバイダにその方法:

public class CustomCredentialsAuthProvider : CredentialsAuthProvider 
{ 
    public override object Authenticate(IServiceBase authService, IAuthSession session, Auth request) 
    { 
     var customUserAuthSession = (CustomUserAuthSession)session; 

     if (!customUserAuthSession.LoginInfo.IsActive) 
     { 
      return new 
      { 
       UserName = customUserAuthSession.UserName, 
       IsActive = customUserAuthSession.LoginInfo.IsActive 
      }; 
     } 

     var isAuthenticated = base.Authenticate(authService, session, request); 

     return isAuthenticated; 
    } 
} 

私はこれについて正しい道を行く、またはカスタムメタデータを格納および取得するためのより良い方法があるアム?

ユーザーのカスタムメタデータに基づいてAuthResponseを変更するにはどうすればよいですか?

カスタムメタデータをAuthSessionに取得するにはどうすればよいですか?

私がやろうとしていることに近づいています。私CustomAuthSession OnAuthenticated()メソッドで:

public override void OnAuthenticated(IServiceBase authService, IAuthSession session, IOAuthTokens tokens, Dictionary<string, string> authInfo) 
    { 
     var customUserAuthSession = (CustomUserAuthSession) session; 

     var userAuth = authService.ResolveService<IUserAuthRepository>().GetUserAuth(session, null); 
     customUserAuthSession.LoginInfo = userAuth.Get<LoginInfo>(); 

     authService.SaveSession(customUserAuthSession); 

     base.OnAuthenticated(authService, session, tokens, authInfo); 
    } 

私はUSERAUTHを再フェッチしていると私は必要なデータとのセッションを投入します。カスタムユーザーセッション用のサービススタックdocumentationに基づいて、いくつかのカスタムデータを入力した後でセッションを保存する必要があります。私はそれをやっていますが、それは貯蓄されていないようです。 CustomCredentialsAuthProviderのAuthenticateメソッドで、セッションに追加したカスタムデータが表示されません。

編集 上記の私の最初の編集での問題は、ユーザーが認証されることをである、そして我々は、彼らがアクティブになっているか、いない場合、私がチェックすることができCustomAuthSessionコードを取得。彼らが活動していない場合は、ログアウトする必要があります。理想的ではありません。

代わりに、私は自分のカスタムCredentialsAuthProviderのAuthenticateメソッドでこれをすべて行うことができます。

public override object Authenticate(IServiceBase authService, IAuthSession session, Auth request) 
    { 
     var userAuthRepo = authService.ResolveService<IUserAuthRepository>(); 
     var userAuth = userAuthRepo.GetUserAuthByUserName(request.UserName); 
     var loginInfo = userAuth.Get<LoginInfo>(); 

     if (!loginInfo.IsActive) 
     { 
      return new CustomAuthResponse 
      { 
       UserName = userAuth.UserName, 
       ResponseStatus = new ResponseStatus("500"), 
       IsActive = loginInfo.IsActive 
      }; 
     } 

     var authResponse = (AuthResponse)base.Authenticate(authService, session, request); 

     return authResponse; 
    } 

私はUSERAUTHをフェッチし、ユーザーのisActiveかいないかどうかを確認するために、要求にユーザ名を使用することができ、リクエストが来ます。そうでなければ、サービススタックがそれらを認証する前に何らかのエラーを返すことができます。

私はこれがうまくいくと思っています。ユーザーがアクティブではないというエラーをクライアントに返すことができます。

誰かがこれを行うためのよりクリーンな方法を持っているなら、それはすばらしいでしょう。

+0

このリンクはあなたに役立つかもしれません[ServiceStack.netのためのIAuthProviderのカスタマイズ - ステップバイステップ](http://enehana.nohea.com/general/customizing-iauthprovider-for-servicestack-net-step-by-step/ ) – stefan2410

+0

そのリンクを読んでくれてありがとうございました。残念ながら、彼はUserAuthテーブルのメタデータ列からカスタムメタデータを取得/設定する方法を示していません。 CustomCredentialsAuthProviderのOnAuthenticatedメソッドでカスタムユーザーセッションにカスタムデータを追加しますが、その例では 'some_firstname_from_db'と表示されます。データベースから再度ユーザーをフェッチする方法を理解できれば、このメソッドでセッションを作成できます。このメソッドがサービススタックと呼ばれる時にはすでに自分の信用証明を確認してこのメ​​ソッドpost auth – officert

+0

を呼び出したので、非常にきれいに見えません。もしあなたがそれらを見つけなかったら、[ここ](https://github.com/ServiceStack/ServiceStack/wiki/Authentication-and-authorization#custom-authentication-and-authorization)と[こちら](http:// rossipedia。 (http://dylanbeattie.blogspot.gr/2013/08/building-servicestack-based-oauth2.html)を参照してください。 、[ここ](http://joeriks.com/2013/01/12/cors-basicauth-on-servicestack-with-custom-authentication/)ほとんどの人はSOサービスマンで活躍していますので、後で答えてくださいあなたの質問。 – stefan2410

答えて

8

ここまでは私の答えです。それは機能し、私がやろうとしていることをすることができますが、これについて最善の方法であるかどうかについてサービススタックのメンバーから聞きたいことがあります。

OrmLiteAuthRepositoryサブクラス新しいクラスを作成するカスタムメタデータ

を保存します。私の場合は、Service StackのSqlデータベース永続性を使用して、必要なテーブルを作成したいだけです。

任意のカスタムメタデータを保存するCreateUserAuthメソッドを再実装:

public UserAuth CreateUserAuth(UserAuth newUser, string password) 
    { 
     newUser.Set(new AccountStatus 
     { 
      IsActive = false, 
      PasswordNeedsReset = true 
     }); 
     return base.CreateUserAuth(newUser, password); 
    } 

はCredentialsAuthProviderをサブクラス新しいクラスを作成するカスタムメタデータ

をフェッチ。 Authenticateメソッドをオーバーライドします。

public override object Authenticate(IServiceBase authService, IAuthSession session, Auth request) 
    { 
     var userAuthRepo = authService.ResolveService<IUserAuthRepository>(); 
     var userAuth = userAuthRepo.GetUserAuthByUserName(request.UserName); 
     var accountStatus= userAuth.Get<AccountStatus>(); 

     if (!accountStatus.IsActive) 
     { 
      throw new InvalidOperationException(string.Format("User {0} is not activated.", request.UserName)); 
     } 
     if (!accountStatus.PasswordNeedsReset) 
     { 
      throw new InvalidOperationException("Your password needs to be reset before you can login."); 
     } 

     var authResponse = (AuthResponse)base.Authenticate(authService, session, request); 

     return authResponse; 
    } 

認証要求がこのメソッドに入力されると、UserAuthとカスタムメタデータを取得します。ユーザーがアクティブでない場合、またはパスワードをリセットする必要がある場合は、エラーメッセージとともにInvalidOperationExceptionをスローします。

クライアントアプリケーションのログインコントローラで、サービスから戻ってきたエラーメッセージを確認して、アカウントがまだアクティブでないことを示すページにリダイレクトするか、パスワードをリセットしてから認証する必要があります。

関連する問題