Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在FormsAuthenticationCookie中存储其他数据?_C#_Asp.net Mvc 4_Cookies_Forms Authentication - Fatal编程技术网

C# 如何在FormsAuthenticationCookie中存储其他数据?

C# 如何在FormsAuthenticationCookie中存储其他数据?,c#,asp.net-mvc-4,cookies,forms-authentication,C#,Asp.net Mvc 4,Cookies,Forms Authentication,我正在从url检索租户名称。我宁愿只做一次,将其存储在cookie中,并在新页面请求中需要时从cookie中检索它 我正在使用下面的代码“创建”cookie。我希望这个界面能让我存储更多的信息,但事实并非如此。是有办法做到这一点,还是我走错了方向 public void SignIn(string userName, bool createPersistentCookie) { if (String.IsNullOrEmpty(userName))

我正在从url检索租户名称。我宁愿只做一次,将其存储在cookie中,并在新页面请求中需要时从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);
    } 

提前感谢。

就我个人而言,我不会试图更改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"

codeplex和Nuget上的FormsAuthenticationExtensions项目正是这样做的

用法-设置值

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"];
基本上,您可以在FormsAuthenticationCookie中附加一个名称/值字典来存储一些常用值。我们利用此存储来存储一小部分用户信息,如companyId等

此外,这里没有“黑魔法”,它只是将属性的设置/检索封装在FormsAuthentication票证中


考虑到这一点,请务必阅读项目页面底部的注释,因为它描述了为什么这只应用于少量长期数据。

您的意思是以后要向cookie中添加任意数据吗?很想说是的。我不应该吗?不,你不应该。四十二票,看看他的答案,你得三票。我能请你解释一下为什么这比汤米给出的答案好吗?或者这是一个品味的问题?我不熟悉Tommy所指的插件,所以我不能对它说话,也不能声称一种方法比另一种“更好”。对于这种方法,它快速且易于实现,将来易于维护,并且不会改变表单auth的任何内容ticket@Forty-我只想在我的答案上加2美分。提供的内容也不会改变FormsAuth票证的任何内容,它只是将UserData属性用于:。这两种方法都没有争论,只是做了一点澄清:)@Tommy明白,说清楚了,我并不是有意暗示这是真的(也就是说,更改了auth票证)。我还没有签出这个项目,所以我不能以这样或那样的方式和它说话。我肯定它能胜任这项工作,否则你不会推荐它的。干杯谢谢你的回答,我会把它标在书签上,稍后再试。我现在就要42的答案+1透。对我来说,它在以下行中给出了一个错误:var ticketData=((FormsIdentity)User.Identity).Ticket.GetStructuredUserData();说它不能将一个对象与另一个对象关联对我来说,它在票证值定义的NameValueCollection处给出了一个错误。当我已经定义了程序集时,它会说“找不到(是否缺少using指令或程序集引用?)”。