繁体   English   中英

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

[英]How do I redirect after authentication in 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);
        }
    }

和POST的形式:

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

您可以在ServiceStack身份验证期间按优先顺序将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
                        };
                    }

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

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;

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM