有没有办法在FormsAuthentication上设置友好名称,这样我就可以访问Context.User.Identity
我想显示带有用户标识指向用户个人资料页面的网址的名字/姓氏。
这就是我目前所拥有的:
查看
@var user = Context.User.Identity;
@if (Request.IsAuthenticated)
{
@Html.ActionLink(user.Name, "Details", "Users", new { id = user.Name });
}
如您所见,它只会显示UserId。
控制器
User user = authService.ValidateUser(model.Email, model.Password);
string alias = string.Format("{0} {1}", user.FirstName, user.LastName);
//I'd like some way to set both the user.UserId and alias in the cookie and access it in the view
FormsAuthentication.SetAuthCookie(user.UserId, createPersistentCookie);
答案 0 :(得分:4)
是的,只需创建自己的IPrincipal
实现。然后将HttpModule连接到PostAuthenticated
事件,在该事件中实例化主体对象并将CurrentUser设置为该实例。现在,只要您访问CurrentUser,您就会得到IPrincipal
的实例,其中包含您需要的所有额外数据。
答案 1 :(得分:0)
我认为最好的方法是使用具有此属性的通用视图模型。您的所有其他视图模型都来自此模型。使用基本控制器并覆盖OnActionExecuted方法,在返回的结果是ViewResult时设置公共视图模型属性。您的视图将强烈键入公共视图模型或其中的子类,允许您直接引用属性。
public class CommonViewModel
{
public string UserDisplayName { get; set; }
public string Username { get; set; }
}
public class FooViewModel : CommonViewModel
{
// view-specific properties
}
public class BaseController : Controller
{
public override void OnActionExecuted( ActionExecutedContext context )
{
if (context.Result is ViewResult)
{
UpdateCommonModel( ((ViewResult)context.Result).ViewData.Model as CommonViewModel );
}
}
private void UpdateCommonModel( CommonViewModel model )
{
User user = authService.ValidateUser(model.Email, model.Password);
modelUserDisplayName = string.Format("{0} {1}", user.FirstName, user.LastName);
model.Username = user.Name;
}
}
查看强>
@if (Request.IsAuthenticated)
{
@Html.ActionLink(model.UserDisplayName, "Details", "Users", new { id = Model.Username });
}
答案 2 :(得分:0)
如果您正在使用MVC 3,则可以使用全局过滤器,如果您确实不想添加基本控制器。
答案 3 :(得分:0)
这是一篇关于这个主题的好文章,它是关于MVC 4编写的:
http://www.codeproject.com/Tips/574576/How-to-implement-a-custom-IPrincipal-in-ASP-NET-MV
代码中有两个小错误,但我在文章底部的评论中指出了它们。