使用部分身份框架将 UserID 存储在 ASP.NET 核心中
Storing a UserID in ASP.NET Core with partial Identity Framework
我已经使用身份框架持久性 cookie(如果用户选择记住我)或会话 cookie 创建了一个登录功能,如果只是标准登录并且没有记住我被勾选。我使用以下代码:
var claimsIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
if (RememberMe)
{
await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme,
new ClaimsPrincipal(claimsIdentity),
new AuthenticationProperties
{
IsPersistent = RememberMe,
ExpiresUtc = DateTimeOffset.UtcNow.AddHours(2)
});
}
else
{
await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme,
new ClaimsPrincipal(claimsIdentity));
}
return RedirectToPage("/index");
我在我的前端使用 VueJS,所以我向我的 SQL 服务器发出各种 axios POST 请求,所以我设置了一个控制器来处理这个问题,如下例所示:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult AddFirm([FromBody] FirmModel model)
{
String query = "exec dbo.A2Q_Edit_0112_RR_UploadNewReview_AddFirm @FIRM_NAME, @USER_ID";
System.Diagnostics.Debug.WriteLine("value:" + model.FIRM_NAME);
using (var connection = new SqlConnection(connectionString))
{
var json = connection.QuerySingle<string>(query, new { FIRM_NAME = model.FIRM_NAME , USER_ID = USER_ID});
return Content(json, "application/json");
}
}
如您所见,我的控制器在我的 SQL 查询中包含一个参数,用于捕获启动存储过程的用户 ID。我想存储这个变量服务器端。我已经阅读了很多帖子,似乎很多人都暗示身份来处理这个问题,因为会话存储用户数据不可靠。因此,我很好奇,当我只使用有限版本的身份来制作 cookie 时,我该如何使用身份。我不需要身份和表等的所有开销。有没有一种方法可以使用身份来存储类似于会话的这些用户变量?如果没有,是否有一种安全的方法来使用此 cookie 来存储用户 ID 或充当用户 ID?或者根据我的描述,会话在这个现代使用 ASP.NET Core 3.1 和 IIS 8 是最好的吗?
这似乎是一件简单的事情,但我在这一方面苦苦挣扎,以在我的 sql 查询参数中填充此用户 ID 变量,而不存储在 VueJS 的前端。
*警告我将来可能会使用 signalIR,这样根据我对在堆栈上看到的帖子的理解,这可能会取消会话作为一个选项。
如果我答对了你的问题,我们需要某种机制来为每个请求获取 UserId
。
如果是这样,请考虑将 UserId
放入 cookie 中,这不是需要确保安全的东西,因为即使 jwt 令牌也有一个 sub
键打算保存某种价值,例如这个。
在 ASP 网络中使用默认 .AddCookie
扩展,您的登录过程应该是
// Create the claims
var claims = new List<Claim>
{
new Claim(ClaimTypes.NameIdentifier, [The UserId goes here]),
// some other require stuff
};
// Sign in
var claimsIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme,
new ClaimsPrincipal(claimsIdentity),
new AuthenticationProperties
{
IsPersistent = RememberMe,
ExpiresUtc = DateTimeOffset.UtcNow.AddHours(2)
});
现在,userId
被存储在cookie中,不要尝试解密,这是生成CfDJ8MblQARvMeFAppYZW16O0Qm0moCi0%2Fu77SujBcwhrmg2gAtPiCrKJEcAL3Ry%2By9Xp8subrazS5ajc%2F4dD153VZrndwSU3dVXmESF0NZxW8oWmyo5lhuGSv9LpgAuQs6pEfRJCeLXpE4%2FxU9SDzyWlk4LLf9HzxiBXTYswPZdvnLr
后cookie内容的示例形式
并且对于与 cookie 相关联的任何请求。我们可以从 User
得到 userId
作为 HttpContext
的 属性。
public IActionResult Index()
{
var user = HttpContext.User.FindFirst(ClaimTypes.NameIdentifier);
var myUserId = user.Value;
// Then pass it along as wished
}
关于使用 SignalR:您的意思是注销用户吗?如果 signalR 可以处理满意的情况,只要应用程序仍然有足够的连接(webSocket 保持它,小心,想象一下只有 3-500 个 CCU 或更多,只是为了这个有时的任务?甚至当连接断开并重新连接时,您仍然需要处理该逻辑)。
相反,为什么不在登录时将唯一密钥附加到 cookie,它会在每次登录会话时重新显示。然后有一个中间件来检查该密钥是否存在于黑名单中(将其存储为缓存会很好),我们将在此处抛出每个需要锁定的 seesion(只要 cookie 生命周期就已过期,在这种情况下, 2 小时)。
完成,不再有连接保持,不再有喜怒哀乐的情况以及 websocket 带来的所有复杂问题。
我已经使用身份框架持久性 cookie(如果用户选择记住我)或会话 cookie 创建了一个登录功能,如果只是标准登录并且没有记住我被勾选。我使用以下代码:
var claimsIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
if (RememberMe)
{
await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme,
new ClaimsPrincipal(claimsIdentity),
new AuthenticationProperties
{
IsPersistent = RememberMe,
ExpiresUtc = DateTimeOffset.UtcNow.AddHours(2)
});
}
else
{
await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme,
new ClaimsPrincipal(claimsIdentity));
}
return RedirectToPage("/index");
我在我的前端使用 VueJS,所以我向我的 SQL 服务器发出各种 axios POST 请求,所以我设置了一个控制器来处理这个问题,如下例所示:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult AddFirm([FromBody] FirmModel model)
{
String query = "exec dbo.A2Q_Edit_0112_RR_UploadNewReview_AddFirm @FIRM_NAME, @USER_ID";
System.Diagnostics.Debug.WriteLine("value:" + model.FIRM_NAME);
using (var connection = new SqlConnection(connectionString))
{
var json = connection.QuerySingle<string>(query, new { FIRM_NAME = model.FIRM_NAME , USER_ID = USER_ID});
return Content(json, "application/json");
}
}
如您所见,我的控制器在我的 SQL 查询中包含一个参数,用于捕获启动存储过程的用户 ID。我想存储这个变量服务器端。我已经阅读了很多帖子,似乎很多人都暗示身份来处理这个问题,因为会话存储用户数据不可靠。因此,我很好奇,当我只使用有限版本的身份来制作 cookie 时,我该如何使用身份。我不需要身份和表等的所有开销。有没有一种方法可以使用身份来存储类似于会话的这些用户变量?如果没有,是否有一种安全的方法来使用此 cookie 来存储用户 ID 或充当用户 ID?或者根据我的描述,会话在这个现代使用 ASP.NET Core 3.1 和 IIS 8 是最好的吗?
这似乎是一件简单的事情,但我在这一方面苦苦挣扎,以在我的 sql 查询参数中填充此用户 ID 变量,而不存储在 VueJS 的前端。
*警告我将来可能会使用 signalIR,这样根据我对在堆栈上看到的帖子的理解,这可能会取消会话作为一个选项。
如果我答对了你的问题,我们需要某种机制来为每个请求获取 UserId
。
如果是这样,请考虑将 UserId
放入 cookie 中,这不是需要确保安全的东西,因为即使 jwt 令牌也有一个 sub
键打算保存某种价值,例如这个。
在 ASP 网络中使用默认 .AddCookie
扩展,您的登录过程应该是
// Create the claims
var claims = new List<Claim>
{
new Claim(ClaimTypes.NameIdentifier, [The UserId goes here]),
// some other require stuff
};
// Sign in
var claimsIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme,
new ClaimsPrincipal(claimsIdentity),
new AuthenticationProperties
{
IsPersistent = RememberMe,
ExpiresUtc = DateTimeOffset.UtcNow.AddHours(2)
});
现在,userId
被存储在cookie中,不要尝试解密,这是生成CfDJ8MblQARvMeFAppYZW16O0Qm0moCi0%2Fu77SujBcwhrmg2gAtPiCrKJEcAL3Ry%2By9Xp8subrazS5ajc%2F4dD153VZrndwSU3dVXmESF0NZxW8oWmyo5lhuGSv9LpgAuQs6pEfRJCeLXpE4%2FxU9SDzyWlk4LLf9HzxiBXTYswPZdvnLr
并且对于与 cookie 相关联的任何请求。我们可以从 User
得到 userId
作为 HttpContext
的 属性。
public IActionResult Index()
{
var user = HttpContext.User.FindFirst(ClaimTypes.NameIdentifier);
var myUserId = user.Value;
// Then pass it along as wished
}
关于使用 SignalR:您的意思是注销用户吗?如果 signalR 可以处理满意的情况,只要应用程序仍然有足够的连接(webSocket 保持它,小心,想象一下只有 3-500 个 CCU 或更多,只是为了这个有时的任务?甚至当连接断开并重新连接时,您仍然需要处理该逻辑)。
相反,为什么不在登录时将唯一密钥附加到 cookie,它会在每次登录会话时重新显示。然后有一个中间件来检查该密钥是否存在于黑名单中(将其存储为缓存会很好),我们将在此处抛出每个需要锁定的 seesion(只要 cookie 生命周期就已过期,在这种情况下, 2 小时)。
完成,不再有连接保持,不再有喜怒哀乐的情况以及 websocket 带来的所有复杂问题。