2013-02-06 83 views
1

我正试图与ServiceStack一起构建一个新的移动产品。它正在慢慢地走到一起,但文件虽然很好,但是有些部分简短,没有评论&问题的便利。关于ServiceStack身份验证的澄清/示例

这个问题是关于内置认证。

我一直在从SocialBootstrap工作,这是一个很好的例子,虽然我缺乏骨干经验是有点阻碍。我想同时学习它,但没有时间去做,所以想继续传统的观点。

基于此,有一些样本或文档扩展将非常有用。

1.为什么AuthUserSession字符串上的所有属性? 我看到通过CustomUserSession类,你可以创建一个CustomId,但不应该默认属性映射到数据库表的AutoIncrement属性?不得不解析为一个整数并不是很理想。我想这只是一次,但仍然显得很古怪。

var user = session.TranslateTo<User>(); 
user.Id = int.Parse(session.UserAuthId); 

2.检索会话 我控制器从ControllerBase它实现ServiceStackController<CustomUserSession>得出的。要想从控制器会话很容易与base.UserSession。如果我需要访问View中的会话,那么我只需将会话填入ViewBag属性中。

我的服务对象扩展AppServiceBase,此刻我已经能够访问会话的唯一方法是通过注射ClientCache

public ICacheClient CacheClient { get; set; } 

,然后调用:

var userSession = SessionFeature.GetOrCreateSession<AuthUserSession>(CacheClient); 

这并未看起来并不是最优雅的解决方案,所以我希望有一种我不知道的更好的方式。可通往..

3 IClientCache 从阅读this question这听起来像我需要实现一个更为持久的会话缓存。每次重新编译时都必须进行身份验证,保存_layout或任何其他应用重置操作都很烦人。

更持久缓存的推荐解决方案是使用Memcached吗?不幸的是,在过去,我只使用FormsAuthentication,所以这又是一个新领域。

container.Register<ICacheClient>(new MemcachedClientCache("127.0.0.0[:11211]"); 

4.手动注册 这是一个奇怪的一个。我试图在没有互联网连接的情况下编码,所以我实施了手动注册,以避免在我的控制器上注释掉所有[Authenticate]属性(视图也有一些登录逻辑)。

它的工作,或者我记得它工作,因为我可以继续调试。然而现在回到互联世界却不是。API端点似乎不存在。如果我浏览到/api/register,那么我会收到NotImplementedException。同样,因为我没有使用主干我有一个JavaScript函数来执行的工作:

var gateway = new servicestack.ClientGateway(location.protocol + "//" + location.host + '/api/'); 

function intiRegisterUser() { 
    $('#signup-button').click(function() { 
     gateway.postFormDataToService({ 
       Register: { 
        userName: $('#Username').val(), 
        displayName: $('#Username').val(), 
        firstName: $('#FirstName').val(), 
        lastName: $('#LastName').val(), 
        email: $('#Email').val(), 
        password: $('#Password').val() 
       } 
      }, 
      function(e) { 
       document.location = "/"; 
      }, 
      function(ex) { 
       handleError(ex); 
      }); 
    }); 
} 

这也返回NotImplementedException

本文档页是伟大的顺便说一句,但可以扩展一点,包括这一些。

https://github.com/ServiceStack/ServiceStack/wiki/Sessions

回答

3

1.为什么在AuthUserSession字符串的所有属性?

ServiceStack's built-in Authentication旨在支持多个Auth存储库和会话提供程序后端。为了能够支持多个提供者并减少创建新提供者所需的摩擦力,许多元数据属性保留为可以容纳任何数据类型的字符串(与只能容纳32位整数的int相对)。

2.检索会话

当使用ServiceStack's New API可以从方便Service基类,它可以让你访问类型化UserAuthSession继承:

base.SessionAs<AuthUserSession>(); 

它还提供了对动态访问会议包:

base.Session["dynamicProperty"] 

3. IClientCache

如果您想要永久缓存,请使用ServiceStack's distributed cache providers中的任意一个。我推荐Redis的这holds many advantages over Memcachedeasy to get running in Windows with Vagrant

4.手动注册

/api/register服务only implements HTTP POST。虽然custom route for the Registration Service is /registerpre-defined route的RegistrationService(其中您的例子是使用)由Registration Request DTO这是推断:

/api/json/syncreply/Registration 

as of v3.9.35 release,较短的别名:

/api/json/reply/Registration 

所以,你的JavaScript示例需要使用注册财产,例如:

gateway.postFormDataToService({ 
    Registration: { .. } 
}); 
+0

谢谢澄清。我认为UserId字符串属性会出于这个原因。也许它在文档中,我跳过了它。服务会话检索要好得多,谢谢!将看看Redis,我打算继续看看它来替换我的数据库。至于注册,我忘了提及我已经尝试过'Registration:'并且它返回相同的NotImplementedException。我还浏览了/ api/json/syncreply /注册 - 这也显示了一个NotImplementedException。我在v3.9.33.0 – Jordan

+0

NuGet更新了一切。得到它的工作,谢谢! – Jordan