【问题标题】:How to store additional data in the FormsAuthentication cookie?如何在 FormsAuthentication cookie 中存储附加数据?
【发布时间】:2013-01-23 09:36:59
【问题描述】:

我正在从 url 中检索租户名称。我宁愿只做一次,将它存储在 cookie 中,并在我需要时在新页面请求中从那里检索它。

我正在使用下面的代码来“创建”一个 cookie。我希望该界面可以让我存储其他信息,但事实并非如此。有没有办法做到这一点,还是我走错了路?

    public void SignIn(string userName, bool createPersistentCookie)
    {
        if (String.IsNullOrEmpty(userName))
            throw new ArgumentException("Value cannot be null or empty.", "userName");

        FormsAuthentication.SetAuthCookie(userName, createPersistentCookie);
    } 

提前致谢。

【问题讨论】:

  • 你的意思是稍后你想在cookie中添加任意数据?
  • 很想答应。我不应该吗?
  • 不,你不应该。四十二知道了,看看他的答案。

标签: c# asp.net-mvc-4 cookies forms-authentication


【解决方案1】:

codeplex 和 Nuget 上的 FormsAuthenticationExtensions 项目正是这样做的。 https://archive.codeplex.com/?p=formsauthext

使用 - 设置值

using FormsAuthenticationExtensions;
using System.Collections.Specialized;

var ticketData = new NameValueCollection
{
    { "name", user.FullName },
    { "emailAddress", user.EmailAddress }
};
new FormsAuthentication().SetAuthCookie(user.UserId, true, ticketData);

使用 - 检索值

using FormsAuthenticationExtensions;
using System.Web.Security;

var ticketData = ((FormsIdentity) HttpContext.Current.User.Identity).Ticket.GetStructuredUserData();
var name = ticketData["name"];
var emailAddress = ticketData["emailAddress"];

基本上,您可以在 FormsAuthentication cookie 中附加一个名称/值字典来存储一些常用值。我们利用该商店存储一小部分用户信息,例如 companyId 等。

此外,这里没有发生“黑魔法”,它只是将 UserData 属性的设置/检索封装在 FormsAuthentication Ticket 内

至于考虑,请务必阅读项目页面底部的注释,因为它描述了为什么只应将其用于少量长寿命数据。

【讨论】:

  • 感谢您的回答,我会添加书签并稍后尝试。我现在就去找四十二的答案。 +1寿。谢谢
  • 对我来说,它在该行出现错误: var ticketData = ((FormsIdentity) User.Identity).Ticket.GetStructuredUserData();说它不能将一个对象与另一个对象关联
  • 对我来说,它在定义 NameValueCollection 的票值处给出错误。它说“找不到(您是否缺少 using 指令或程序集引用?)”当我已经定义了程序集时。
【解决方案2】:

就我个人而言,我不会尝试更改 Auth Cookie。相反,创建一个新的 cookie:

var myCookie = new HttpCookie("myCookie");//instantiate an new cookie and give it a name
myCookie.Values.Add("TenantName", "myTenantName");//populate it with key, value pairs
Response.Cookies.Add(myCookie);//add it to the client

然后你可以像这样读取写入cookie的值

var cookie = Request.Cookies["myCookie"];
var tenantName = cookie.Values["TenantName"].ToString();
//tenantName = "myTenantName"

【讨论】:

  • 您获得 3 票。我可以请你解释为什么这比汤米给出的答案更好吗?还是口味问题?
  • 我不熟悉 Tommy 所指的插件,所以我无法与之交谈,或者声称一种方式比另一种方式“更好”。至于这个方法,实现起来又快又容易,以后也容易维护,对forms auth ticket没有任何改动
  • @Forty-2 - 只是想在我的回答中投入 2 美分。提供的内容也不会更改有关 FormsAuth 票证的任何内容,它只是使用 UserData 属性:msdn.microsoft.com/en-us/library/…。不会就这两种方法进行辩论,只是稍微澄清一下:)
  • @Tommy 明白了,需要明确的是,我并不是要暗示它确实如此(即更改身份验证票)。我还没有检查过这个项目,所以我不能以一种或另一种方式谈论它。我确定它确实有效,否则您不会推荐它。干杯
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-29
相关资源
最近更新 更多