关于ServiceStack身份验证的说明/示例

时间:2013-02-06 14:26:33

标签: session authentication memcached servicestack

我正在尝试使用ServiceStack来构建一个新的移动产品。它正在慢慢融合在一起,但文档尽管很好,但在部分内容有点简短,没有评论的便利性。的问题。

此问题与内置身份验证有关。

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

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

1。为什么AuthUserSession字符串上的所有属性都是 我已经通过CustomUserSession类看到你可以创建一个CustomId但是不应该是数据库表的AutoIncrement属性的默认属性映射吗?必须解析为整数并不是很理想。我想它只做了一次,但看起来仍然很奇怪。

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

2。检索会话 我的控制器派生自实现ControllerBase的{​​{1}},因此使用ServiceStackController<CustomUserSession>可以轻松地从控制器进入会话。如果我需要访问base.UserSession中的会话,那么我只需将会话填入View属性。

我的服务延伸ViewBag,目前我能够访问会话的唯一方法是注入AppServiceBase

ClientCache

然后致电:

public ICacheClient CacheClient { get; set; }

这似乎不是最优雅的解决方案,所以我希望有一种我不知道的更好的方法。这导致..

第3。 IClientCache 从阅读this question看起来我需要实现更持久的会话缓存。每次重新编译,保存var userSession = SessionFeature.GetOrCreateSession<AuthUserSession>(CacheClient); 或任何其他应用程序重置操作时都必须进行身份验证,这非常烦人。

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

_layout

4。手动注册 这很奇怪。我试图在没有互联网连接的情况下进行编码,因此我实施了手动注册,以避免在控制器上注释掉所有container.Register<ICacheClient>(new MemcachedClientCache("127.0.0.0[:11211]"); 属性(视图也有一些登录逻辑)。

它有效,或者我记得它正常工作,因为我可以继续调试。然而现在回到互联世界却没有。并且API端点似乎不存在。如果我浏览到[Authenticate],那么我会收到/api/register。同样,由于我没有使用骨干,我有一个javascript函数来执行工作:

NotImplementedException

这也会返回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); }); }); }

这个文档页面很棒,但可以扩展一下以包含其中一些。

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

1 个答案:

答案 0 :(得分:3)

<强> 1。为什么AuthUserSession字符串上的所有属性都是

ServiceStack's built-in Authentication旨在支持多个Auth Repository和Session提供程序后端。为了能够支持多个提供程序并减少创建新提供程序所需的摩擦,许多元数据属性保留为可以保存任何数据类型的字符串(而不是只能容纳32位整数的int)。 / p>

<强> 2。检索会话

使用ServiceStack's New API时,您可以从方便的Service基类继承,它允许您使用以下命令访问键入的UserAuthSession:

base.SessionAs<AuthUserSession>();

它还提供对动态Session包的访问:

base.Session["dynamicProperty"]

第3。 IClientCache

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

<强> 4。手动注册

/api/register服务only implements HTTP POST。虽然注册服务的custom route for the Registration Service is /register pre-defined route(您的示例正在使用)由Registration Request DTO推断,但是:

/api/json/syncreply/Registration

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

/api/json/reply/Registration

因此,您的javascript示例需要使用注册属性,例如:

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