FormsAuthentication友好名称

时间:2011-01-09 19:04:57

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

有没有办法在FormsAuthentication上设置友好名称,这样我就可以访问Context.User.Identity

中的ID和友好名称

我想显示带有用户标识指向用户个人资料页面的网址的名字/姓氏。

这就是我目前所拥有的:

查看

@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);

4 个答案:

答案 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

代码中有两个小错误,但我在文章底部的评论中指出了它们。