Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc ASP.NET MVC-具有Windows身份验证的自定义IIdentity或IPrincipal_Asp.net Mvc_Windows Authentication_Extend_Iprincipal - Fatal编程技术网

Asp.net mvc ASP.NET MVC-具有Windows身份验证的自定义IIdentity或IPrincipal

Asp.net mvc ASP.NET MVC-具有Windows身份验证的自定义IIdentity或IPrincipal,asp.net-mvc,windows-authentication,extend,iprincipal,Asp.net Mvc,Windows Authentication,Extend,Iprincipal,我正在使用Windows登录身份验证的intranet站点上工作。但是,我想扩展IPrincipal以具有其他属性。例如,我想在@user.FirstName或user.AuthorizedActivityAdmin/Permissions/Edit中获取用户的名字,然后使用活动而不是角色从数据库中检索某些链接,等等。在过去的两天里,我真的花了很长时间才弄清楚这一点,并找到了很多使用Windows身份验证的信息 我的CustomPrincipal和BaseViewPage设置: namespac

我正在使用Windows登录身份验证的intranet站点上工作。但是,我想扩展IPrincipal以具有其他属性。例如,我想在@user.FirstName或user.AuthorizedActivityAdmin/Permissions/Edit中获取用户的名字,然后使用活动而不是角色从数据库中检索某些链接,等等。在过去的两天里,我真的花了很长时间才弄清楚这一点,并找到了很多使用Windows身份验证的信息

我的CustomPrincipal和BaseViewPage设置:

namespace Intranet_v2.Helpers
{ 
    public interface ICustomPrincipal : IPrincipal
    {
        Guid UserGuid { get; set; }
        string FirstName { get; set; }
        string LastName { get; set; }
        string FullName { get; set; }
    }

    public class CustomPrincipal : ICustomPrincipal
    {
        public IIdentity Identity { get; private set; }
        public bool IsInRole(string role) { return false; }

        public CustomPrincipal(string identity)
        {
            this.Identity = new GenericIdentity(identity);
        }

        public Guid UserGuid { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string FullName { get; set; }
    }

    public class CustomPrincipalSerializeModel
    {
        public Guid UserGuid { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string FullName { get; set; }
    }

    public class BaseController : Controller
    {
        protected virtual new CustomPrincipal User
    {   
            get { return HttpContext.User as CustomPrincipal; }
        }
    }

    public abstract class BaseViewPage : WebViewPage
    {
        public virtual new CustomPrincipal User
        {
            get { return base.User as CustomPrincipal; }
        }
    }

    public abstract class BaseViewPage<TModel> : WebViewPage<TModel>
    {
        public virtual new CustomPrincipal User
        {
            get { return base.User as CustomPrincipal; }
        }
    }
}
现在,@User.Name现在为空。在这件事上我有点不知所措。感谢您的帮助。我的受保护的无效应用程序\u PostAuthenticateRequestobject发件人EventArgs args完全不正常


我所要做的就是依靠Windows身份验证来完成它通常所做的工作,并向HttpContext.Current.User添加一些额外的属性。感谢您的帮助。。。我不可能是唯一一个尝试这样做的人。

我通常只会在以后请求额外的用户信息。例如,使用以下扩展方法:

public static class PrincipalExtensions
{
   private static void Initialize(string userName)
   {
      var userRecord = //Get user information from DB;

      var session = HttpContext.Current.Session;
      if (session != null)
      {
         session.Add("UserID", userRecord.ID);
         session.Add("UserEmail", userRecord.Email);
         //And so on
      }
   }

   public static long? GetUserID(this IPrincipal user)
   {
      var id = HttpContext.Current.Session["UserID"] as long?;
      if (id == null)
        Initialize();

      return (long)HttpContext.Current.Session["UserID"];
   }
}

这大概就是我在一些项目中实施的内容;系统不需要进入登录过程并将其存储在cookie中,而是可以在需要信息时延迟加载信息并在会话中缓存。

例如,我如何才能使其工作,以便在视图中访问GetUserID?我想对缺乏正确权限的用户隐藏一些元素。其想法是GetUserID是IPrincipal上的一个扩展方法,因此在视图中,必须确保命名空间可用,以便它可以看到扩展。然后它会像这样工作。User.GetUserID.Yes!事实上,它确实在视图中起到了它本来应该起的作用。我遇到了一个问题,嘿,你在你的项目中做了这么多重大的更改,intellisense将成为一个混蛋问题。重新启动Visual Studio,并按预期在视图中拾取它。非常感谢。
protected void Application_PostAuthenticateRequest(object sender, EventArgs args)
{
    //var application = (HttpApplication)sender;
    var context = application.Context;

    if (context.User != null || !context.User.Identity.IsAuthenticated) return;

    var formsIdentity = (FormsIdentity)context.User.Identity;

    if (formsIdentity == null) return;

    var ticket = formsIdentity.Ticket;


    JavaScriptSerializer serializer = new JavaScriptSerializer();

    CustomPrincipalSerializeModel serializeModel = serializer.Deserialize<CustomPrincipalSerializeModel>(ticket.UserData);

    CustomPrincipal newUser = new CustomPrincipal(ticket.Name);
    newUser.UserGuid = serializeModel.UserGuid;
    newUser.FirstName = serializeModel.FirstName;
    newUser.LastName = serializeModel.LastName;
    newUser.FullName = serializeModel.FullName;

    var values = ticket.UserData.Split('|');

    var roles = values[1].Split(',');

    context.User = new GenericPrincipal(new GenericIdentity(ticket.Name, "Forms"), roles);
}
public static class PrincipalExtensions
{
   private static void Initialize(string userName)
   {
      var userRecord = //Get user information from DB;

      var session = HttpContext.Current.Session;
      if (session != null)
      {
         session.Add("UserID", userRecord.ID);
         session.Add("UserEmail", userRecord.Email);
         //And so on
      }
   }

   public static long? GetUserID(this IPrincipal user)
   {
      var id = HttpContext.Current.Session["UserID"] as long?;
      if (id == null)
        Initialize();

      return (long)HttpContext.Current.Session["UserID"];
   }
}