ServiceStack身份验证[Authenticate]属性无法处理ss-id和ss-pid

时间:2014-01-31 14:50:50

标签: authentication servicestack

我创建了一个调用AuthenticateService的TestService并对用户进行身份验证。在调用TestService之前,我清除了所有cookie,以确保一旦得到响应,我就会得到ss-idss-pid个cookie。

AppHost配置:(SS v4.0.8.0)

//Plugins
Plugins.Add(new RazorFormat());
Plugins.Add(new SessionFeature());
Plugins.Add(new AuthFeature(() => new CustomUserSession(),
            new IAuthProvider[] { new CustomCredentialsAuthProvider() }));

container.Register<ICacheClient>(new MemoryCacheClient());

我的CustomCredentialsAuthProvider

public class CustomCredentialsAuthProvider : CredentialsAuthProvider
{
    public override bool TryAuthenticate(IServiceBase authService, string userName, string password)
    {
        // Custom Auth Logic
        // Return true if credentials are valid, otherwise false
        // bool isValid = Membership.ValidateUser(userName, password);
        return true;
    }

    public override void OnAuthenticated(IServiceBase authService, IAuthSession session, IAuthTokens tokens, Dictionary<string, string> authInfo)
    {
        base.OnAuthenticated(authService, session, tokens, authInfo);

        var loginManager = authService.TryResolve<LoginManager>();
        var loginInfo = loginManager.GetLoginInfo(session.UserAuthName);

        authService.SaveSession(loginInfo.CustomUserSession, SessionExpiry);
    }
}

我的TestService

public class TestService : Service
{       
    public object Any(Test request)
    {
        var response = new TestResponse();

        var authService = base.ResolveService<AuthenticateService>();            
        var authResponse = authService.Authenticate(new Authenticate
        {
            UserName = "user",
            Password = "password",
            RememberMe = false
        });           

        base.Request.ResponseContentType = MimeTypes.Html;  //Temporary workaround, will not be needed in v4.0.9+

        return response;
    }
}

所以,回顾一下。我点击了TestService,对用户进行了身份验证,返回响应并确保响应中包含ss-idss-pid个Cookie。现在我尝试点击另一个具有[Authenticate]属性的服务。我在服务中的断点从未命中,我在浏览器中得到了这个响应。

  

未找到请求处理程序:

     

Request.HttpMethod:GET Request.PathInfo:/ login   Request.QueryString:ServiceStack.NameValueCollectionWrapper
  Request.RawUrl:?/登录重定向= HTTP%3A%2F%2flocalhost%3a50063%2fBOP%2fbasic-INFO-2

我尝试在服务方法和整个服务上应用[Authenticate]属性,结果相同。我已经测试过,如果[Authenticate]属性被注释掉,我可以使用服务方法,这样可行,所以它不是服务配置问题或路由问题。

我还创建了两种服务方法/basic-info-1/basic-info-2/basic-info-2具有[Authenticate]属性,basic-info-1没有。basic-info-1。在进行身份验证后,我可以毫无问题地访问OnAuthenticated(),并且还确认我可以访问/basic-info-2方法中保存的会话信息。对于[Authenticate],我得到了处理程序错误。

我不确定/login属性中发生了什么,但是从该处理程序错误的外观来看,身份验证失败并且SS尝试将我重定向到我的项目中不存在的ss-id因此处理程序错误我想知道为什么authenticate属性无法识别我的ss-pid和{{1}} Cookie?

1 个答案:

答案 0 :(得分:1)

诊断:

在使用/basic-info-1进行身份验证后,应检查未经身份验证的方法(/test)中返回的会话。如果您的会话工作正常,您应该会在会话中正确设置UserAuthIdUserAuthNameId。它们似乎没有正确设置,因此[Authenticate]属性看不到有效的会话。

可能的问题:

问题可能出在您的OnAuthenticated方法中,特别是您的LoginManager在保存会话时未正确返回这些值。

从你的代码:

var loginManager = authService.TryResolve<LoginManager>();
var loginInfo = loginManager.GetLoginInfo(session.UserAuthName); 

authService.SaveSession(loginInfo.CustomUserSession, SessionExpiry);
  • loginInfo.CustomUserSession.UserAuthIdnull
  • loginInfo.CustomUserSession.UserAuthNamenull
  • loginInfo.CustomUserSession.Idnull

解决方案:

在调用SaveSession之前正确设置这些属性。