Как мне перенаправить после аутентификации в ServiceStack

Я переопределил 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>

2 ответа

Решение

Различные места, где вы можете установить URL для перенаправления во время аутентификации ServiceStack, в порядке приоритета:

  1. Переменную Continue QueryString, FormData или Request DTO при выполнении запроса к /auth
  2. Session.ReferrerUrl Веб-сайт
  3. Заголовок HTTP Referer HTTP
  4. CallbackUrl в AuthConfig текущего используемого AuthProvider

Учитывая этот порядок предпочтений, если запрос не имеет параметра Continue, он должен использовать session.ReferrerUrlтак что вы можете сделать:

if (roleA) session.ReferrerUrl = "http://myPage1Url";
if (roleB) session.ReferrerUrl = "http://myPage2Url";

mythz,

Хороший призыв сделать эту OSS.:)

Вы правы относительно порядка приоритета:

  1. Переменная Continue QueryString, FormData или Request DTO при выполнении запроса к / auth
  2. The Session.ReferrerUrl Url HTTP
  3. Заголовок HTTP реферера
  4. CallbackUrl в AuthConfig текущего используемого AuthProvider

Таким образом, в моем примере у меня не было переменной Continue QueryString, Form Data или Request DTO, и у меня не было CallbackUrl и, конечно, не Session.ReferrerUrl, потому что это первая публикация Session.

От AuthService.cs:

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

По умолчанию referrerUrl будет иметь значение заголовка Referer из запроса. И это то, что будет назначено заголовку Location дальше вниз по Post метод 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";
        }

Только во втором POST того же сеанса клиент перейдет на сайт www.msn.com (в этом примере), поскольку сеанс уже заполнен. Я думаю это:

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

Должен быть определен после вызова авторизации.

Другие вопросы по тегам