如何在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设置为重定向到的不同位置:
- 在向
/auth
发出请求时, 继续 QueryString,FormData或Request DTO变量 -
Session.ReferrerUrl
Url - HTTP Referer HTTP标头
- 使用当前AuthProvider的AuthConfig中的CallbackUrl
根据这些首选项顺序,如果请求没有Continue参数,则应使用session.ReferrerUrl
,因此您可以执行以下操作:
if (roleA) session.ReferrerUrl = "http://myPage1Url"; if (roleB) session.ReferrerUrl = "http://myPage2Url";
mythz,
很好地致力于制作这个OSS。 🙂
关于优先顺序你是对的:
- 在向/ auth发出请求时,继续QueryString,FormData或Request DTO变量
- Session.ReferrerUrl Url HTTP
- Referer HTTP标头
- 使用当前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.cs
的Post
方法中进一步分配给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后确定。