我正在尝试设计一个解决方案,其中ServiceStack服务器只能使用ASP.NET中的身份验证cookie。 (实际上,它可能是任何cookie。它只是获得一个会话ID,它可以使用反向通道查找详细信息)。自定义身份验证提供程序似乎不是正确的方向,因为它们基于发送的凭据。相反,GlobalRequestFilter对我更有意义。在那里,我检查cookie,获取外部会话信息,然后将它们设置为ServiceStack会话并设置IsAuthenticated。这在请求服务中工作正常,因为它可以访问所需的会话详细信息。好到目前为止。
问题是,当我决定使用Authenticate属性锁定服务时,它显然会在我的过滤器之前运行该属性,因此它总是希望将它们重定向到登录。添加逻辑的建议位置是什么,以便在Authenticate属性之前触发并正确验证?
答案 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 (),
}));