我正在尝试使用 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
.
顺便说一句,这个文档页面很棒,但可以扩展一点以包含其中的一些内容。