14

我在获取 ServiceStack [Authentication] 属性以在 ASP.Net MVC4 控制器中工作时遇到问题,即使正确提交了登录详细信息,具有该属性的页面/操作方法也会将用户重定向到登录页面。

我遵循了 SocialBootstrapApi 示例,不同之处在于所有身份验证 Web 服务调用都是从控制器进行的:

this.CreateRestClient().Post<RegistrationResponse>("/register", model);

到目前为止我做过的其他事情:

  • 使用我自己的用户会话实现子类化 AuthUserSession(与示例没有太大区别,但使用我自己的 User 表实现)
  • 在我的 BaseController 上继承 ServiceStackController,覆盖默认登录 URL
  • 使用我的用户会话实现在 AppHost 中启用身份验证功能

注册确实有效,用户身份验证逻辑有效(即使会话不存在),我可以在请求中看到ss-idss-pidcookie。

所以我的完整问题清单:

  1. 如何使 [Authenticate] 属性起作用(或者,我做错了什么)?
  2. 如何在 MVC 控制器中保存和重用用户会话?目前this.UserSession始终为空。
  3. 如何注销用户?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:)

4

2 回答 2

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;
    }
}

其他一切(包括会话)现在都可以正常工作。

于 2012-08-24T04:06:47.453 回答
4

您可以在ServiceStack 用例存储库中找到它是如何完成的。以下示例基于 MVC4,但也适用于 MVC3:CustomAuthenticationMvc

于 2012-10-12T11:47:55.743 回答