Как мне перенаправить после аутентификации в 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, в порядке приоритета:
- Переменную Continue QueryString, FormData или Request DTO при выполнении запроса к
/auth
Session.ReferrerUrl
Веб-сайт- Заголовок HTTP Referer HTTP
- CallbackUrl в AuthConfig текущего используемого AuthProvider
Учитывая этот порядок предпочтений, если запрос не имеет параметра Continue, он должен использовать session.ReferrerUrl
так что вы можете сделать:
if (roleA) session.ReferrerUrl = "http://myPage1Url";
if (roleB) session.ReferrerUrl = "http://myPage2Url";
mythz,
Хороший призыв сделать эту OSS.:)
Вы правы относительно порядка приоритета:
- Переменная Continue QueryString, FormData или Request DTO при выполнении запроса к / auth
- The Session.ReferrerUrl Url HTTP
- Заголовок HTTP реферера
- 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;
Должен быть определен после вызова авторизации.