C# 正在获取在FormsAuthenticationTicket的UserData中设置的用户名

C# 正在获取在FormsAuthenticationTicket的UserData中设置的用户名,c#,asp.net-mvc,facebook,forms-authentication,C#,Asp.net Mvc,Facebook,Forms Authentication,我正在考虑在我的视图中使用此选项(Razor语法)获取我网站的用户名: 以下是utils类: public class Utils { static FormsIdentity id = (FormsIdentity)HttpContext.Current.User.Identity; public static string UserName { get { return id.Ticket.UserData; } } } 此代码是否存在任何潜在问题 我这样做的原因是,当用

我正在考虑在我的视图中使用此选项(Razor语法)获取我网站的用户名:

以下是utils类:

public class Utils
{
    static FormsIdentity id = (FormsIdentity)HttpContext.Current.User.Identity;

    public static string UserName { get { return id.Ticket.UserData; } }
}
此代码是否存在任何潜在问题

我这样做的原因是,当用户登录时,我会将用户名存储在新表单的userdata字段中

我是这样处理的,因为我正在使用FacebookConnect,希望在db的用户名字段中存储那里的ID,并将他们的用户名/全名存储在一个单独的表中

因此,我处理facebook用户名和我的网站注册用户名的逻辑需要以不同的方式处理。登录后,我想在那里处理它,然后将userdata设置为实际用户名

因此,在整个站点中,我只需使用:
@MySite.Helpers.Utils.UserName

这听起来可以吗?它是一个静态变量这一事实会成为一个问题吗

还是有更好的管理方法?可能是会话变量

谢谢

我这样做的原因是 因为我要把用户名存储在 新数据库的userdata字段 当 用户登录

当前登录用户的用户名已存储在身份验证cookie中。您不需要在UserData中再次存储它。为了在Razor模板中检索它,您可以简单地:

@User.Identity.Name
显然,建议使用
[Authorize]
属性修饰呈现此视图的控制器操作,以确保用户在访问它之前经过身份验证,否则您可能会使用此代码获得
NullReferenceException

或者,您可以编写一个帮助器:

public static MvcHtmlString Username(this HtmlHelper htmlHelper)
{
    var identity = htmlHelper.ViewContext.HttpContext.User.Identity;
    if (identity.IsAuthenticated)
    {
        return MvcHtmlString.Create(identity.Name);
    }
    return MvcHtmlString.Empty;
}
您可以这样使用:

@Html.Username()

我意识到了这一点,但我继续解释为什么我要把它储存在那里。我的facebook用户用户名保存在另一个表中。我基本上想要一种简单的方法来获取用户名,无论是facebook用户还是站点注册用户。@raklos,因此存储在UserData中的用户名与存储在身份验证cookie中的用户名不同,即,当前登录的用户与存储在UserData属性中的用户不同?@Darin-在我的网站上注册的人-@user.Identity.Name将提供用户名。使用facebook@User.Identity.Name注册的人会给出他们的facebook ID——一组数字。它们的名称存储在单独的表中。我希望能够以一种方式无缝地获取用户名,这就是我考虑将其放入UserData的原因。@raklos,好的,我现在明白了。所以你只需要重新适应一下我的助手方法,你就可以开始了。就我个人而言,我更喜欢helper方法,而不是使用静态方法。@Darin,-我是否需要包括@using Mysite.Helpers.Extensions;在每个使用username?的视图中,我非常确定将
id
存储为静态变量会给您带来问题。改为将其设置为属性。@jbinto这是一个不准确的语句,因为op在运行时通过HttpContext.Current对象将id值绑定到上下文实例。通过@raklos的编码方式,您可以在运行时访问gaurentee,如果您处于无法访问HttpContext的状态,则您将仅访问当前请求的id。当前,您将获得一个空引用错误。
@Html.Username()