自定义会话无法使用身份验证

时间:2016-07-06 17:33:35

标签: session cookies servicestack

我正在尝试设计一个解决方案,其中ServiceStack服务器只能使用ASP.NET中的身份验证cookie。 (实际上,它可能是任何cookie。它只是获得一个会话ID,它可以使用反向通道查找详细信息)。自定义身份验证提供程序似乎不是正确的方向,因为它们基于发送的凭据。相反,GlobalRequestFilter对我更有意义。在那里,我检查cookie,获取外部会话信息,然后将它们设置为ServiceStack会话并设置IsAuthenticated。这在请求服务中工作正常,因为它可以访问所需的会话详细信息。好到目前为止。

问题是,当我决定使用Authenticate属性锁定服务时,它显然会在我的过滤器之前运行该属性,因此它总是希望将它们重定向到登录。添加逻辑的建议位置是什么,以便在Authenticate属性之前触发并正确验证?

1 个答案:

答案 0 :(得分:2)

ServiceStack的[Autenticate]属性用于ServiceStack's AuthProvider model,因此您仍然希望使用自定义AuthProvider。您可以查看上一版本说明中的IAuthWithRequest Auth Providers,了解创建不基于使用凭据的自定义身份验证提供程序的示例:

通过在AuthProvider中实现IAuthWithRequest接口,[Authenticate]请求过滤器将在验证用户是否经过身份验证之前调用PreAuthenticate()执行任何身份验证。如果用户已通过身份验证,您可以在此处填充用户会话,例如:

public class MyAuthProvider : AuthProvider, IAuthWithRequest
{
    public override bool IsAuthorized(IAuthSession session, IAuthTokens tokens, Authenticate request = null)
    {
        return session.IsAuthenticated;
    }

    public override object Authenticate(IServiceBase authService, IAuthSession session, Authenticate request)
    {
        throw new NotImplementedException("Authenticate() should not be called directly");
    }

    public void PreAuthenticate(IRequest req, IResponse res)
    {
        //Do any Auth validation...

        //populate the Session in the Request to Authenticate this user
        req.Items[Keywords.Session] = new AuthUserSession { 
           UserName = ...,
           Email = ...,
           //populate other fields
           IsAuthenticated = true,
        };
    }
}

然后注册您的自定义身份验证提供程序,将其添加到AuthFeature中的AppHost.Configure()插件中,例如:

Plugins.Add(new AuthFeature(() => new AuthUserSession(),
  new IAuthProvider[] { 
    new MyAuthProvider (),
  }));