gpt4 book ai didi

asp.net - 存储 DotNetOpenAuth 信息和用户信息检索

转载 作者:太空狗 更新时间:2023-10-30 01:40:58 26 4
gpt4 key购买 nike

这个问题有点像结构/设计问题,因为我无法找到执行任务的最佳方式。

在我的 MVC 应用程序中,我使用 DotNetOpenAuth (3.4) 作为我的登录信息提供者,并且只使用标准的 FormsAuthentication 来处理 cookie 等。

数据库中的当前用户表有:

  • UserId(PK,唯一标识符)
  • OpenIdIdentifier (nvarchar(255))
  • OpenIdDisplay (nvarchar(255))
  • 显示名称 (nvarchar(50))
  • 电子邮件 (nvarchar(50))
  • 电话号码 (nvarchar(50))

由于 UserId 是用户的明确标识符(他们应该能够在以后更改其 OpenId 提供者),因此它是其他表链接到(对于用户)的键。

这是当前代码,在成功验证后创建一个临时用户并重定向到创建操作。

        switch (response.Status)
{
case AuthenticationStatus.Authenticated:

FormsAuthentication.SetAuthCookie(response.ClaimedIdentifier, false);

var users = new UserRepository();
if (!users.IsOpenIdAssociated(response.ClaimedIdentifier))
{
var newUser = new DueDate.Models.User();
newUser.OpenIdIdentifer = response.ClaimedIdentifier;
newUser.OpenIdDisplay = response.FriendlyIdentifierForDisplay;

TempData["newUser"] = newUser;

return this.RedirectToAction("Create");
}

现在是问题的关键:

  1. response.ClaimedIdentifier 是否是针对用户存储的正确信息?

  2. FormAuthentication.SetAuthCookie 是表单例份验证的首选方式吗?还是有更好的方法?

  3. 当我调用 SetAuthCookie 时,除了 ClaimedIdentifier 之外没有与用户相关的数据。如果我一直引用他们的 UserId,创建用户是更好的主意,然后将 UserId 存储在 cookie 中而不是 ClaimedIdentifier?

  4. 如果我在多个地方使用该 UserId,我该如何从 cookie 中检索它,或者将它存储在其他更合乎逻辑/有用的地方?

有点啰嗦,但我一直无法找到最好的方法/

最佳答案

1.Is the response.ClaimedIdentifier the correct piece of information to be storing against a user?

。并确保将其存储在数据库中的列区分大小写。这是一个表模式,演示了如何确保它区分大小写。这来自 DotNetOpenAuth 项目模板的数据库架构。指定排序规则的“CS”位代表区分大小写。

CREATE TABLE [dbo].[AuthenticationToken] (
[AuthenticationTokenId] INT IDENTITY (1, 1) NOT NULL,
[UserId] INT NOT NULL,
[OpenIdClaimedIdentifier] NVARCHAR (250) COLLATE SQL_Latin1_General_CP1_CS_AS NOT NULL,
[OpenIdFriendlyIdentifier] NVARCHAR (250) NULL,
[CreatedOn] DATETIME NOT NULL,
[LastUsed] DATETIME NOT NULL,
[UsageCount] INT NOT NULL
);

2.Is FormAuthentication.SetAuthCookie the preferred way to forms authentication? Or is there a better way?

对于 MVC 应用程序,它肯定是,因为您仍然可以从该方法返回您首选的 ActionResult

3.When I call SetAuthCookie, there is no data relating to the user except for the ClaimedIdentifier. If I'm consistently referring to their UserId, is a better idea to create the user, then store that UserId in the cookie instead of the ClaimedIdentifier?

这听起来像是个人偏好。但我通常会使用 user_id,因为它可能会在每次传入 HTTP 请求时导致更快的数据库查找,这需要您查找任何用户信息。

4.If I'm using that UserId in a number of places, how do I either retrieve it from the cookie, or store it somewhere else more logical/useful?

FormsAuthentication 确实提供了一种方法来在其加密的 cookie 中存储更多信息,而不仅仅是用户名,但使用起来比您预期的要难。此代码段来自 DotNetOpenAuth 的网络 SSO RP 示例:

const int TimeoutInMinutes = 100; // TODO: look up the right value from the web.config file
var ticket = new FormsAuthenticationTicket(
2, // magic number used by FormsAuth
response.ClaimedIdentifier, // username
DateTime.Now,
DateTime.Now.AddMinutes(TimeoutInMinutes),
false, // "remember me"
"your extra data goes here");

HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(ticket));
Response.SetCookie(cookie);
Response.Redirect(Request.QueryString["ReturnUrl"] ?? FormsAuthentication.DefaultUrl);

然后您可以通过以下方式在未来的 HTTP 请求中获取额外数据:

var cookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
if (cookie != null) {
var ticket = FormsAuthentication.Decrypt(cookie.Value);
if (!string.IsNullOrEmpty(ticket.UserData)) {
// do something cool with the extra data here
}
}

关于asp.net - 存储 DotNetOpenAuth 信息和用户信息检索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2196965/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com