如何在ASP.Net MVC控制器中正确使用ServiceStack身份验证

时间:2012-08-21 22:51:24

标签: c# authentication forms-authentication asp.net-mvc-4 servicestack

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

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

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

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

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

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

所以我的完整问题列表:

  1. 如何使[Authenticate]属性起作用(或者,我做错了什么)?
  2. 如何在MVC控制器中保存和重用用户会话?目前this.UserSession始终为空。
  3. 如何退出用户? this.CreateRestClient().Get<AuthResponse>("/auth/logout");似乎不起作用。

  4. 更新1:
    在我提交任何凭据之前,当我尝试加载安全页面(具有[Authenticate]属性的页面)时,会创建会话cookie(ss-idss-pid)。这是预期的行为吗?

    更新2:
    我可以看到会话保存在MemoryCacheClient中,但尝试通过this.Cache.Get<CustomUserSession>(SessionKey)在基本控制器中检索它会返回null(其中SessionKey类似于:urn:iauthsession:1

2 个答案:

答案 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