9

CredentialsAuthProvider を次のようにオーバーライドしました。

public override bool TryAuthenticate(IServiceBase authService, string userName, string password)
        {
            //TODO: Auth the user and return if valid login
            return true;
        }

public override void OnAuthenticated(IServiceBase authService, IAuthSession session, IOAuthTokens tokens, Dictionary<string, string> authInfo)
        {
            base.OnAuthenticated(authService, session, tokens, authInfo);

            //User has been authenticated

            //Find the user's role form the DB

            if (roleA)
                //GOTO mypage1

            if (roleB)
                //GOTO mypage2
        }

~/auth/Credentials への簡単な投稿を実行し、認証が機能し、OnAuthenticated メソッドが呼び出されている間に、ロールなどに基づいてユーザーを適切なページに実際にリダイレクトするにはどうすればよいですか?

OnAuthenticated メソッドで次のことを行うのにうんざりしましたが、望ましい効果はありませんでした。

authService.("/ビュー/顧客");

スターター テンプレートを使用して更新します (以下のコメントを参照)。

public class CustomCredentialsAuthProvider : CredentialsAuthProvider
    {
        public override bool TryAuthenticate(IServiceBase authService, string userName, string password)
        {
            return true;
        }

        public override void OnAuthenticated(IServiceBase authService, IAuthSession session, IOAuthTokens tokens, Dictionary<string, string> authInfo)
        {
            session.ReferrerUrl = "http://www.msn.com";

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

そして、投稿するフォーム:

<form method="POST" action="/auth/credentials">
        <input name="UserName"/>
        <input name="Password" type="password"/>
        <input type="submit"/>
    </form>
4

2 に答える 2

7

ServiceStack 認証中にリダイレクトする URL を設定できるさまざまな場所は、優先度順に次のとおりです。

  1. 要求を行うときのContinue QueryString、FormData、または Request DTO 変数/auth
  2. Session.ReferrerUrlURL _
  3. HTTPリファラーHTTP ヘッダー
  4. 現在使用されている AuthProvider の AuthConfig 内のCallbackUrl

これらの設定の順序を考えると、リクエストにContinueパラメータがない場合は、 を使用する必要があるsession.ReferrerUrlため、次のようにすることができます。

if (roleA) session.ReferrerUrl = "http://myPage1Url";
if (roleB) session.ReferrerUrl = "http://myPage2Url";
于 2012-11-13T17:22:21.367 に答える
2

神話、

この OSS を作成するのは良いことです。:)

優先順位に関しては正しいです:

  1. /auth への要求を行うときの Continue QueryString、FormData、または Request DTO 変数
  2. Session.ReferrerUrl Url HTTP
  3. リファラー HTTP ヘッダー
  4. 現在使用されている AuthProvider の AuthConfig 内の CallbackUrl

したがって、私の例では、Continue QueryString、Form Data、または Request DTO 変数はありませんでした。CallbackUrl もありませんでした。これはセッションの最初の投稿であるため、Session.ReferrerUrl もありませんでした。

からAuthService.cs:

var referrerUrl = request.Continue
    ?? session.ReferrerUrl
    ?? this.RequestContext.GetHeader("Referer")
    ?? oAuthConfig.CallbackUrl;

デフォルトでは、referrerUrl にはリクエストからの Referer ヘッダー値が含まれます。Postそして、それが次のメソッドのさらに下にある Location ヘッダーに割り当てられることになりますAuthService.cs

if (!(response is IHttpResult))
                    {
                        return new HttpResult(response) {
                            Location = referrerUrl
                        };
                    }

認証されると、session.ReferrerUrlここで が設定され、応答がクライアントに送信されます。上記の Location プロパティは、以下の値ではなく、元のリファラーに設定されます。

public override void OnAuthenticated(IServiceBase authService, IAuthSession session, IOAuthTokens tokens, Dictionary<string, string> authInfo)
        {
            session.ReferrerUrl = "http://www.msn.com";
        }

セッションは既に読み込まれているため、クライアントが www.msn.com (この例では) に移動するのは、同じセッションの 2 番目の POST のみです。私はこう思います:

var referrerUrl = request.Continue
                ?? session.ReferrerUrl
                ?? this.RequestContext.GetHeader("Referer")
                ?? oAuthConfig.CallbackUrl;

auth の呼び出し後に決定する必要があります。

于 2012-11-13T21:45:33.337 に答える