2012-11-13 33 views
9

身份验证后,我覆盖了CredentialsAuthProvider像这样:如何重定向ServiceStack

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 
     } 

我进行简单的后期到〜/认证/证书并且在认证工作和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); 
     } 
    } 

而且形式POST:

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

回答

7

不同的地方,你可以设置URL重定向到期间ServiceStack Authentication,按优先级顺序是:

  1. 继续查询字符串,用于FORMDATA或发出请求时,/auth
  2. Session.ReferrerUrl地址
  3. 的HTTP 的Referer HTTP头
  4. CallbackUrl在当前AuthProvider的AuthConfig请求DTO可变

鉴于这些顺序的偏好,如果请求没有继续参数,它应该使用session.ReferrerUrl,所以你可以这样做:

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

工作......有点......这是行为:我必须提交表单两次。 这是我的设置:我有一个default.cshtml内容页面在登录表单的根目录中。看着小提琴手,我能看到的唯一区别是,第一次加载页面时,我没有ss-id cookie。一旦我提交表单,服务器将我发送回default.cshtml。但是这次用ss-id。如果我第二次提交,你描述的重定向工作。什么与ss-id? – legion

+0

还有一点需要注意,我确实得到了ss-pid,并且我有了Plugins.Add(new SessionFeature());在AppHost中。 – legion

+0

'ss-id'在[ServiceStack的会话维基页面](https://github.com/ServiceStack/ServiceStack/wiki/Sessions)中有描述 – mythz

2

mythz,

进行此OSS良好的通话。 :)

你是正确的关于优先顺序:

  1. 将继续查询字符串,FORMDATA或当 提出请求请求DTO变量/ AUTH
  2. 的Session.ReferrerUrl网址HTTP
  3. Referer的HTTP头
  4. 的CallbackUrl在当前AuthProvider的AuthConfig使用

所以在我的例子中,我没有继续QueryString,表单数据或请求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在这里设置的响应将被发送到客户端的位置属性上面的设置到原来的引用,而不是值以下:

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

这只是同一会话的第二个职位将在客户端浏览到www.msn.com(在本例中),因为会话已经填充。我认为这是:

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

需要确定后调用auth。

+0

同意,修正[在此提交中](https://github.com/ServiceStack/ServiceStack/commit/49833b731d2d8e402be358088ca060cb8bab42f0),在本周末的下一个ServiceStack版本中提供。顺便说一句,随时发送这样的未来的东西拉请求:) – mythz

+1

太棒了。下次会做,顺便说一句,伟大的框架。我不会回头...我相信你以前听说过这个,但SS需要更多的文档和最佳实践。 – legion

+0

我认为[ServiceStack wiki](https://github.com/ServiceStack/ServiceStack/wiki)已经非常全面。这是一个社区wiki,所以如果你觉得有什么可以改进 - 随时添加它。 – mythz