如何在ServiceStack中进行身份validation后重定向

我像这样覆盖了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 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执行一个简单的post,当身份validation工作并调用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 authInfo) { session.ReferrerUrl = "http://www.msn.com"; base.OnAuthenticated(authService, session, tokens, authInfo); } } 

和POST的forms:

 

您可以在ServiceStack身份validation期间按优先顺序将Url设置为重定向到的不同位置:

  1. 在向/auth发出请求时, 继续 QueryString,FormData或Request DTO变量
  2. Session.ReferrerUrl Url
  3. HTTP Referer HTTP标头
  4. 使用当前AuthProvider的AuthConfig中的CallbackUrl

根据这些首选项顺序,如果请求没有Continue参数,则应使用session.ReferrerUrl ,因此您可以执行以下操作:

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

mythz,

很好地致力于制作这个OSS。 🙂

关于优先顺序你是对的:

  1. 在向/ auth发出请求时,继续QueryString,FormData或Request DTO变量
  2. Session.ReferrerUrl Url HTTP
  3. Referer HTTP标头
  4. 使用当前AuthProvider的AuthConfig中的CallbackUrl

所以在我的例子中,我没有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标头值。 这就是将在AuthService.csPost方法中进一步分配给Location头的AuthService.cs

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

一旦经过身份validation,并在此处设置session.ReferrerUrl ,响应将被发送到客户端,并将上面的Location属性设置为原始referrer,而不是以下值:

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

只有在同一会话的第二个POST上,客户端才会导航到www.msn.com(在此示例中),因为会话已经填充。 我认为这:

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

需要在调用auth后确定。