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

时间:2012-11-13 03:16:58

标签: c# .net 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 个答案:

答案 0 :(得分:7)

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

  1. /auth提出请求时继续 QueryString,FormData或Request DTO变量
  2. Session.ReferrerUrl网址
  3. HTTP Referer HTTP标头
  4. 当前使用的AuthProvider的AuthConfig中的 CallbackUrl
  5. 根据这些偏好顺序,如果请求没有继续参数,则应使用session.ReferrerUrl,因此您可以这样做:

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

答案 1 :(得分:2)

mythz,

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

关于优先顺序你是对的:

  1. 继续QueryString,FormData或Request DTO变量时 向/ auth
  2. 提出请求
  3. Session.ReferrerUrl Url HTTP
  4. Referer HTTP Header
  5. 当前使用的AuthProvider的AuthConfig中的CallbackUrl
  6. 所以在我的例子中,我没有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标头值。这就是将Post的{​​{1}}方法下方的位置标题分配的内容:

    AuthService.cs

    经过身份验证,此处设置了if (!(response is IHttpResult)) { return new HttpResult(response) { Location = referrerUrl }; } ,响应将发送到客户端,并将上面的位置属性设置为原始引荐来源,而不是以下值:

    session.ReferrerUrl

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

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

    需要在致电身份验证后确定。