我正在根据Nancy.Demo.Authentication.Forms敲响一个演示应用。
我正在我的Claims
课程中实施UserName
和UserIdentity:IUserIdentity
,根据演示,我有一个UserModel
UserName
。
在SecureModule
课程中,我可以看到Context.CurrentUser
可用于查看登录的是谁,但根据界面,这仅提供用户名和声明。如果我需要为视图模型获取更多数据(比如登录用户的消息),我可以看到用作db查询的过滤器的是用户名,感觉很好,很奇怪。我宁愿使用用户的uniqueIdentifier。
如果最好将额外的字段添加到我的IUserIdentity
实施或UserModel
,我认为我想要深究的是什么?在哪里填充这些?
不确定我的问题是否清楚(我的头脑中并不清楚!),但是一些基本的基本架构建议可能会受到影响。
答案 0 :(得分:11)
对不起延迟回复..此刻忙碌一点:)
IUserIdentity是使用Nancy内置身份验证帮助程序所需的最小接口,您可以实现该功能,并为您的类添加任意数量的附加信息;它类似于标准.net IPrincipal。如果你确实添加了自己的信息,你显然必须转换为你的实现类型来访问其他字段。我们可以添加一个CurrentUser方法来阻止你这么做,但它似乎有点多余。
如果您愿意,可以在这里停止阅读,或者如果您对表格身份验证的工作方式感兴趣,可以继续阅读。
FormsAuth使用IUsernameMapper(现在可能名称错误)的实现来在存储在客户端cookie中的Guid用户标识符和实际用户(IUserIdentity)之间进行转换。值得注意的是,这个GUID需要映射到某个地方的用户/ id,但它不是你的数据库主键,它只是你(可能是可预测的)用户id /名称和“token”之间的间接层。存储在客户端上。虽然cookie是加密的和HMACd(取决于你的配置),如果有人设法破解并重建auth cookie,他们将不得不猜测别人的GUID以冒充他们,而不是更改用户名(到“admin”)或某事(或某事)(或第一位用户为1)。
希望有道理:)