验证后,User.Identity.Name为null

时间:2012-06-18 13:40:53

标签: asp.net asp.net-mvc facebook

我正在尝试使用facebook connect在我的ASP.NET MVC应用程序中验证用户。 我写了控制器获取facebook access_token,facebook用户的电子邮件,然后使用以下方式验证用户:

FormsAuthentication.SetAuthCookie(loggedUserEmail, true);

在所有这些之后我将用户重定向到主页面,在那里我尝试获取User.Identity.Name以显示已登录用户的名称(在这种情况下,它将是我猜的电子邮件)。 不幸的是,User.Identity.Name为null。 但是,身份验证过程似乎可以正常工作,因为Request.IsAuthenticated返回true ...

@if (Request.IsAuthenticated) {
    <p>
        @* ###THIS LINE THROWS EXCEPTION AS User.Identity.Names IS NULL### Hello, @Html.ActionLink(User.Identity.Name, "ChangePassword", "Account", routeValues: null, htmlAttributes: new { @class = "username", title = "Change password" })!*@ 
        @Html.ActionLink("Log off", "LogOff", "Account")
    </p>
}

为什么没有启动User.Identity.Name的任何想法? 谢谢,

巴特

P.S。 而不是

FormsAuthentication.SetAuthCookie(loggedUserEmail, true);

我也试过

var authCookie = FormsAuthentication.GetAuthCookie(loggedUserEmail, true);
var ticket = FormsAuthentication.Decrypt(authCookie.Value);
// We want to change the expiration of our forms authentication cookie
// to match the token expiration date, but you can also use your own expiration
DateTime expiration = ticket.IssueDate.AddSeconds(facebookTokenExpirationSeconds);
var newTicket = new FormsAuthenticationTicket(ticket.Version, ticket.Name,
                  ticket.IssueDate, expiration, 
                  ticket.IsPersistent, facebookName);

// Encrypt the cookie again
authCookie.Value = FormsAuthentication.Encrypt(newTicket);

// Manually set it (instead of calling FormsAuthentication.SetAuthCookie)
Response.Cookies.Add(authCookie);

但它也不会使User.Identity.Names包含任何内容......

2 个答案:

答案 0 :(得分:0)

也许我认为,重定向页面后访问令牌已过期。

答案 1 :(得分:0)

我不相信在下一个请求发出之前将设置身份。我在过去通过手动将HttpContext.Current.User设置为我在执行登录逻辑后从Forms Auth票证创建的IPrincipal来解决这个问题。

这样的事情(你的里程可能会有所不同):

var authCookie = Request.Cookies[FormsAuthentication.FormsCookieName];
var ticket = FormsAuthentication.Decrypt(authCookie.Value);
var identity = new GenericIdentity(ticket.Name);
var principal = new GenericPrincipal(identity, null);
HttpContext.Current.User = principal