我在使用ServiceStack [Authentication]属性在ASP.Net MVC4控制器中工作时遇到问题,即使在正确提交登录详细信息后,使用该属性的页面/操作方法也会将用户重定向到登录页面。
我遵循了SocialBootstrapApi示例,不同之处在于所有身份验证Web服务调用都来自控制器:
this.CreateRestClient().Post<RegistrationResponse>("/register", model);
到目前为止我做过的其他事情:
注册确实有效,用户身份验证逻辑可以正常工作(即使会话不存在),我可以在请求中看到ss-id
和ss-pid
个Cookie。
所以我的完整问题列表:
this.UserSession
始终为空。this.CreateRestClient().Get<AuthResponse>("/auth/logout");
似乎不起作用。 更新1:
在我提交任何凭据之前,当我尝试加载安全页面(具有[Authenticate]属性的页面)时,会创建会话cookie(ss-id
和ss-pid
)。这是预期的行为吗?
更新2:
我可以看到会话保存在MemoryCacheClient
中,但尝试通过this.Cache.Get<CustomUserSession>(SessionKey)
在基本控制器中检索它会返回null(其中SessionKey类似于:urn:iauthsession:1
)
答案 0 :(得分:6)
经过多次摆弄后,显然挂钩ServiceStack身份验证的方法是通过以下方式调用AuthService:
try {
authResponse = AuthService.Authenticate(new Auth{ UserName = model.UserName, Continue = returnUrl, Password = model.Password });
} catch (Exception ex) {
// Cut for brevity...
}
和不 authResponse = this.CreateRestClient().Post<AuthResponse>("/auth/credentials", model);
!
其中AuthService
在基本控制器中定义为:
public AuthService AuthService
{
get
{
var authService = ServiceStack.WebHost.Endpoints.AppHostBase.Instance.Container.Resolve<AuthService>();
authService.RequestContext = new HttpRequestContext(
System.Web.HttpContext.Current.Request.ToRequest(),
System.Web.HttpContext.Current.Response.ToResponse(),
null);
return authService;
}
}
其他所有内容(包括会话)现在都能正常工作。
答案 1 :(得分:4)
您可以在ServiceStack Use Cases存储库中找到它的完成方式。以下示例基于MVC4,但适用于MVC3:CustomAuthenticationMvc。