servicestack,C#,.net,servicestack" /> servicestack,C#,.net,servicestack" />

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

C# 在ServiceStack中进行身份验证后如何重定向,c#,.net,servicestack,C#,.net,servicestack,我已覆盖CredentialAuthProvider,如下所示: public override bool TryAuthenticate(IServiceBase authService, string userName, string password) { //TODO: Auth the user and return if valid login return true; } public overrid

我已覆盖CredentialAuthProvider,如下所示:

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
        }
public override bool TryAuthenticate(IServiceBase authService、字符串用户名、字符串密码)
{
//TODO:对用户进行身份验证,如果登录有效,则返回
返回true;
}
已验证的公用覆盖无效(IServiceBase authService、IAAuthSession会话、IOAuthTokens令牌、字典authInfo)
{
base.OnAuthenticated(authService、会话、令牌、authInfo);
//用户已通过身份验证
//从数据库中查找用户的角色
如果(roleA)
//转到mypage1
if(roleB)
//转到mypage2
}
我执行一个简单的post to ~/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);
        }
    }
公共类CustomCredentialAuthProvider:CredentialAuthProvider { 公共覆盖bool TryAuthenticate(IServiceBase authService、字符串用户名、字符串密码) { 返回true; } 已验证的公用覆盖无效(IServiceBase authService、IAAuthSession会话、IOAuthTokens令牌、字典authInfo) { session.refererURL=”http://www.msn.com"; base.OnAuthenticated(authService、会话、令牌、authInfo); } } 以及邮寄表格:

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

按照优先顺序,您可以在不同的位置设置要重定向到的Url:

  • /auth
  • Session.refererURL
    Url
  • HTTPRefererHTTP头
  • 使用的当前AuthProvider的AuthConfig中的回调URL
  • 根据这些首选项顺序,如果请求没有Continue参数,它应该使用
    会话.refererURL
    ,因此您可以执行以下操作:

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

    做这个OSS很不错。:)

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

  • 继续查询字符串、FormData或请求DTO变量 向/auth发出请求
  • Session.refererURL是HTTP的Url
  • 引用HTTP头
  • 使用的当前AuthProvider的AuthConfig中的回调URL
  • 因此,在我的示例中,我没有Continue QueryString、Form Data或Request DTO变量,也没有CallbackUrl,当然也没有Session.refererURL,因为这是会话的第一个post

    AuthService.cs

    var referrerUrl = request.Continue
        ?? session.ReferrerUrl
        ?? this.RequestContext.GetHeader("Referer")
        ?? oAuthConfig.CallbackUrl;
    
    if (!(response is IHttpResult))
                        {
                            return new HttpResult(response) {
                                Location = referrerUrl
                            };
                        }
    
    默认情况下,refererURL将具有来自请求的Referer头值。这就是将分配给位置标题的内容,该位置标题位于
    AuthService.cs
    Post
    方法的下方:

    var referrerUrl = request.Continue
        ?? session.ReferrerUrl
        ?? this.RequestContext.GetHeader("Referer")
        ?? oAuthConfig.CallbackUrl;
    
    if (!(response is IHttpResult))
                        {
                            return new HttpResult(response) {
                                Location = referrerUrl
                            };
                        }
    
    一旦经过身份验证,并且在此处设置了
    会话.refererURL
    ,响应将发送到客户端,并将上面的Location属性设置为原始referer,而不是下面的值:

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

    需要在调用auth后确定。

    这起作用了……某种程度上……行为如下:我必须提交两次表单。这是我的设置:我在登录表单所在的根目录中有一个default.cshtml内容页。看着fiddler,我能看到的唯一区别是,第一次加载页面时,我没有ss id cookie。提交表单后,服务器会将我发送回default.cshtml。但是这次是用ss-id。如果我第二次提交的话,你描述的重定向是有效的。ss id是怎么回事?请注意,我确实得到了ss pid,并且我有插件;在AppHost中,
    ss id
    在Ok中描述。为了确保我不会发疯,我安装了Starter ASP.NET网站模板-ServiceStact nuget包。这是一个简单的表单:和身份验证提供者:就是它。使用starter模板运行它,您将看到在重定向到msn.com之前必须发布两次。您是从ServiceStack页面或其他页面加载HTML表单的第一个页面吗?同意,已修复,可在本周末的下一版本ServiceStack中提供。顺便说一句,请随意发送一个拉请求,以获取类似以下内容:)太棒了。下一次就可以了,顺便说一句,框架很棒。我不会回头看。。。我相信你以前听过这个,但是SS需要更多的文档和最佳实践。我认为这已经相当全面了。这是一个社区维基,所以如果你觉得有什么可以改进的,可以随意添加。