9

我已经像这样覆盖了 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.("/views/customers");

使用 Starter Template 更新(见下面的评论):

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>
4

2 回答 2

7

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

  1. 发出请求时的Continue QueryString、FormData 或 Request DTO 变量/auth
  2. Session.ReferrerUrl网址_
  3. HTTP引用者HTTP 标头
  4. 当前使用的 AuthProvider 的 AuthConfig 中的CallbackUrl

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

if (roleA) session.ReferrerUrl = "http://myPage1Url";
if (roleB) session.ReferrerUrl = "http://myPage2Url";
于 2012-11-13T17:22:21.367 回答
2

神话,

制作这个 OSS 很好。:)

关于优先顺序,您是正确的:

  1. 向 /auth 发出请求时的 Continue QueryString、FormData 或 Request DTO 变量
  2. Session.ReferrerUrl URL HTTP
  3. 引用 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 标头值。这就是将分配给 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;

需要在调用 auth 后确定。

于 2012-11-13T21:45:33.337 回答