1

こんにちは皆さん、私はカスタムメンバーシッププロバイダーとカスタムロールプロバイダーを使用しています。そして、これらを正しく使用してログインしています。また、他のユーザー情報にアクセスできるように、独自のMembershipユーザーオブジェクトを実装しました。ページを変更するたびにすべてのデータを読み込む必要はありませんが、現在、これを正しく機能させることはできません。以下は私のユーザーオブジェクトです:

public class User : MembershipUser
{
    [Required(ErrorMessage = "Username cannot be blank")]
    [Display(Name = "User name")]
    public string UserName { get; set; }

    [Required(ErrorMessage = "Password cannot be blank")]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    public string Password { get; set; }

    [Display(Name = "User ID")]
    public long UserID { get; set; }

    [Display(Name = "Family Name")]
    [StringLength(50, ErrorMessage = "Family name cannot be longer than 50 characters")]
    public string FamilyName { get; set; }

    [Display(Name = "Given Name")]
    [StringLength(50, ErrorMessage = "Given name cannot be longer than 50 characters")]
    public string GivenName { get; set; }

    public Company Company { get; set; }

    public virtual IIdentity Identity { get; set; }
}

そして、ユーザーがログインすると、次のログインメソッドを呼び出します。

    [AllowAnonymous]
    [HttpPost]
    public ActionResult Login(User model, string returnUrl)
    {
        FormsAuthentication.SignOut();
        if(Membership.ValidateUser(model.UserName, model.Password))
        {
            FormsAuthentication.SetAuthCookie(model.UserName, true);
            return RedirectToAction("Index", "");
        }
        ViewBag.Message = "Failed to login";
        return View();
    }

しかしHttpContext.User、インデックスを呼び出すと、名前/ IDだけが含まれ、残りのユーザーオブジェクトは含まれません。カスタムFormAuthenticationオブジェクトを作成する必要がありますか?それとも、このすべてのユーザー情報をHttpContext.Sessionオブジェクト内に保存するのが標準的なプロセスですか?または、ユーザーに拡張してもらいますSystem.Security.Principle.IPrincipleか?またはController.TempData?または、私がよく知らない他の場所。ユーザーデータをロードするために毎回データベースにアクセスする必要はありません。

これらが明白な質問である場合は申し訳ありませんが、私はWeb開発にかなり慣れておらず、これらのことを行う一般的な方法が何であるかわかりません。ビルド内の承認属性を使用しようとしています。

4

1 に答える 1

5

私は自分のアイデンティティを実装することでそれを行いました。そうすれば、必要な数のプロパティを簡単に追加できます。以下は、カスタム プロパティ FriendlyName を使用したコード例です。

public class Identity : IIdentity
    {
        public Identity(int id, string name, string friendlyName, string roles)
        {
            this.ID = id;
            this.Name = name;
            this.FriendlyName = friendlyName;
            this.Roles = roles;
        }



  public Identity(string name, string data)
    {
        if (string.IsNullOrWhiteSpace(data))
            throw new ArgumentException();

        string[] values = data.Split('|');
        if (values.Length != 3)
            throw new ArgumentException();

        this.Name = name;
        this.ID = Convert.ToInt32(values[0]);
        this.FriendlyName = values[1];
        Roles = values[2];
    }

    public string AuthenticationType
    {
        get { return "Custom"; }
    }

    public bool IsAuthenticated
    {
        get { return true; }
    }

    public override string ToString()
    {
        return FriendlyName;
    }

    public string GetUserData()
    {
        return string.Format("{0}|{1}|{2}", ID, FriendlyName, Roles);
    }


    public int ID { get; private set; }
    public string Name { get; private set; }
    public string FriendlyName { get; private set; }
    public string Roles { get; private set; }
}

//in controller on login action:
        Identity id = new Identity(user.ID,  user.Username, "some friendly name", user.Roles);
        DateTime expire = DateTime.Now.AddMinutes(FormsAuthentication.Timeout.TotalMinutes);
        FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(id.ID, user.Username, DateTime.Now, expire, false, id.GetUserData());
        string hashTicket = FormsAuthentication.Encrypt(ticket);
        HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, hashTicket);
        HttpContext.Response.Cookies.Add(cookie);

global.asax には次のものがあります。

public override void Init()
        {
            base.Init();
            PostAuthenticateRequest += new EventHandler(MvcApplication_PostAuthenticateRequest);
        }

    void MvcApplication_PostAuthenticateRequest(object sender, EventArgs e)
    {
        HttpCookie authCookie = Request.Cookies[FormsAuthentication.FormsCookieName];
        if (authCookie != null)
        {
            FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);
            if (authTicket == null || authTicket.Expired)
                return;

            Identity id = new Identity(authTicket.Name, authTicket.UserData);
            Principal user = new Principal(id);
            Context.User = user;
            Thread.CurrentPrincipal = user;
        }
    }
于 2012-09-12T07:28:37.990 に答える