在数据库中,我有表格:USERS,USERS_PROFILES,USERS_CLAIMS。
create table dbo.USERS
(
Id int identity not null,
Username nvarchar (120) not null,
Email nvarchar (120) not null
);
create table dbo.USERS_PROFILES
(
Id int not null,
[Name] nvarchar (80) not null
);
create table dbo.USERS_CLAIMS
(
Id int not null,
[Type] nvarchar (200) not null,
Value nvarchar (200) not null,
);
我正在使用声明授权。当用户注册并创建标识时。标识包含声明,每个声明都有一个类型和一个值:
用户名来自用户的用户名类型> 电子邮件类型>来自用户的电子邮件 名称键入>USERS_PROFILES中的名称 角色类型>直接从USERS_CLAIMS
所以我正在从 3 个表中的许多列创建标识。
我最终得到了这个,因为我迁移到了声明身份验证。
问题
我应该将用户名、电子邮件和姓名移动到USERS_CLAIMS吗?USERS_PROFILES桌会消失...USERS表将仅包含诸如"UserId,LastLoginDate,CreatedDate,..."之类的信息。
如果我想通过用户名获取用户,我只会获得用户名类型的声明......
如果我想登录用户,我只需获取所有声明并创建标识。
因此,身份模型与 SQL 表非常相似。
这有意义吗?您将如何设计表格?
谢谢米格尔
您正在创建键值存储。 它们是在SQL中查询的噩梦。 考虑通过USER_CLAIMS
表上的值查询用户属性的难度。 例:
-- Users with name and email by username
SELECT p.ID, p.Username, p.Name, p.Email, u.LastLoggedIN
FROM USER_PROFILES p
INNER JOIN Users u on p.ID = u.ID
WHERE p.ID = @UserID
-- Users with name and email by username with a claims table
-- Does not specify whether there is only one email, so this could return multiple
-- rows for a single user.
SELECT p.ID, cUName.Value as Username, cName.Value as Name, cEMail.Value as Email, u.LastLoggedIN
FROM Users u
LEFT OUTER JOIN USER_CLAIMS cName ON u.ID = cName.ID and cName.[Type] = 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name'
LEFT OUTER JOIN USER_CLAIMS cUName ON u.ID = cUName.ID and cUName.[Type] = 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/privatepersonalidentifier'
LEFT OUTER JOIN USER_CLAIMS cEmail ON u.ID = cEmail.ID and cEmail.[Type] = 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/email'
WHERE p.ID = @UserID
一个用户可以有多个配置文件吗? 如果没有,则不需要"USERS_PROFILES"表。 保留"用户"表上的"用户名"和"电子邮件"列。 如果将它们放在"USERS_CLAIMS"表上,则每当用户提出索赔时,您都会存储冗余信息。
我不确定您希望对用户进行哪种跟踪,但我建议使用一个单独的表来跟踪用户登录的时间。 像这样:
CREATE TABLE USERS_LOG (user_id INT, log_in DATETIME);
然后,您可以删除"USERS"表上的"LastLoginDate",并执行联接以获取用户上次登录的时间。 它将为您提供更多跟踪用户的方法,并且您不会通过不断更新"USERS"表来创建块。