1

我正在尝试使用 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

4

1 回答 1

3

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

ServiceStack 的内置身份验证旨在支持多个身份验证存储库和会话提供程序后端。为了能够支持多个提供者并减少创建新提供者所需的摩擦,许多元数据属性仍然作为可以保存任何数据类型的字符串(与只能保存 32 位整数的 int 相对)。

2. 检索会话

使用ServiceStack 的 New API时,您可以从方便的Service基类继承,该基类允许您访问类型化的 UserAuthSession:

base.SessionAs<AuthUserSession>();

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

base.Session["dynamicProperty"]

3.IClientCache

如果您想要永久缓存,请使用任何ServiceStack 的分布式缓存提供程序。我推荐 Redis,它比 Memcached 具有许多优势,并且很容易在 Windows 中使用 Vagrant 运行

4. 手动注册

/api/register服务仅实现 HTTP POST。虽然注册服务的自定义路由是 /register,但注册服务预定义路由(您的示例正在使用)由注册请求 DTO推断,即:

/api/json/syncreply/Registration

从 v3.9.35 release 开始,较短的别名:

/api/json/reply/Registration

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

 gateway.postFormDataToService({
    Registration: { .. }
 });
于 2013-02-06T19:34:01.900 回答