【发布时间】:2014-09-29 09:23:06
【问题描述】:
我的网站使用会话 cookie 和表单身份验证。当用户进来时,菜单会检查用户是否通过以下方式登录:
Request.IsAuthenticated
这行得通。
然后我在部分视图中为用户个人资料构建该菜单项,如下所示:
@model MyApp.Models.LoginStatusModel
@if (Model.IsAuthenticated)
{
<a href="#" class="dropdown-toggle menuItem" data-toggle="dropdown" style="color: red;">@User.Identity.Name <b class="caret"></b></a>
}
else
{
<a href="#" class="dropdown-toggle menuItem" data-toggle="dropdown">Profile <b class="caret"></b></a>
}
<ul class="dropdown-menu">
@if (!Model.IsAuthenticated)
{
<li><a href="/Account/Register">Register</a></li>
<li><a href="/Account/Login">Login</a></li>
<li><a href="/Account/ForgotPassword">Forgot Password</a></li>
}
else
{
<li><a href="/Trak/List">Trak</a></li>
<li><a href="/Account/ChangePassword">Change Password</a></li>
<li><a href="/Account/EditProfile">Edit Profile</a></li>
<li><a href="/Account/Logout">Logout</a></li>
}
</ul>
这行得通。
在我的主页控制器操作中(HomeController Index 方法我有这个:
public ActionResult Index()
{
try
{
var topGuys = FillTopGuys();
var upcomingMatches = GetUpcomingMatches();
var pickemLeaders = GetPickemLeaders();
var wtGuys = GetTrakGuys();
var wtSchools = GetTrakSchools();
return View(new HomeModel
{
TopGuys = topGuys,
UpcomingEvents = upcomingMatches,
Leaders = pickemLeaders,
Schools = wtSchools,
Guys = wtGuys
});
}
catch (Exception ex)
{
_errorService.LogError(new Exception("Exception occurred trying to load the home page. " + ex.Message, ex));
return View("Error");
}
}
但是,在下面的 GetTrakGuys 方法中,User.Identity.Name 返回为空(或 null)。我现在无法说出确切的值,除了我有代码通过电子邮件将值发送给我并且它是空白的。 (我在工作,所以无法通过 Visual Studio 进行调试,但仍在尝试修复它)
private List<WtWrestlerModel> GetTrakGuys()
{
var body = "";
try
{
body = "Username: " + User.Identity.Name + Environment.NewLine;
if (string.IsNullOrEmpty(User.Identity.Name))
return null;
.................
}
catch {}
}
为什么 User.Identity.Name 在这里是空白的,即使部分视图能够使用该值,并且其他控制器也使用相同的 User.Identity.Name?
编辑:
我不确定这是否重要(通常在这种情况下,对吗?),但我在整个 HomeController 上使用 DevTrends.DonutCaching...
编辑2:
以下是在 HomeController 上配置 DonutCaching 的方式:
#if !DEBUG
[DonutOutputCache(Duration = 3600)]
#endif
public class HomeController : Controller
我昨晚部署了这个更新(显然是在 Dev box 上工作的……但那里没有缓存)。即使从昨晚过去了一个小时,它仍然不起作用。
哦,也许它正在缓存整个 Index 方法(本来是为匿名用户准备的),因为它被缓存了,而不是“甜甜圈”缓存的一部分,所以每个人都会得到缓存的响应......
【问题讨论】:
-
您使用的是哪种身份验证??
-
表格,它在问题的第一行... :)
-
甜甜圈缓存的事情可能很重要......这是如何配置的?
-
@RobertLevy 见 Edit2。我将对甜甜圈缓存进行调整,看看是否可以修复...
标签: c# asp.net-mvc asp.net-mvc-4 session forms-authentication