0

フォームにログインがあります。ユーザーがログインするとき、ユーザーは 2 つのタイプから選択し、ユーザー名とパスワードを送信する必要があります。

私はそれを行うことができ、ユーザーを認証するためにモデルに接続できます。次に、彼が正しい名前とパスワードを入力した場合は、次のようにします。

FormsAuthentication.SetAuthCookie(login.UserName, login.RememberMe);

しかし、彼のタイプを保存する方法が必要です。私はセッションでそれをしなければならないと思います、そうですか?はいの場合、どのようにお願いしますか?そうでない場合、最善の方法は何ですか?

4

4 に答える 4

1

Sessionコントローラー内でオブジェクトを使用するだけです。

Session["usertype"] = yourType;

ただし、この種の情報保存にはカスタム クラスを使用します。多数のユーザーがいる場合は、このソリューションも再設計する必要があります (セッションの保存場所またはオンライン ユーザー データの場所をまったく再検討してください)。

于 2013-10-29T18:06:37.133 に答える
1

セッションを使用したい場合は、Session.

何でも収納できます。そのため、必要に応じてログイン オブジェクト全体を保存できます。

Session["user"] = yourUser;

セッションは各ユーザーに固有であるため、適切な場所です。

Web アプリケーションで MemberShip クラスを使用している場合は、カスタム フィールドを追加することができます。これが問題の最良の解決策だと思います。このまたはこのブログ投稿を参照してください。これにより、情報がユーザーのセッションに保存されるだけでなく、このユーザー タイプがデータベース内に追加されます。

于 2013-10-29T18:09:43.887 に答える
1

場合によります。ユーザーがブラウザを閉じた後に「タイプ」を保存する必要がありますか? セッションで保存すると、次に開いたときに消えてしまうからです。

保存する必要がある場合は、代わりに Cookie を使用することをお勧めします。

Cookie を追加するには、次のようにします。

this.Response.Cookies.Add(new HttpCookie("my-cookie-name", myValueToSave));
于 2013-10-29T18:10:55.637 に答える
0

「彼のタイプを保存する」とはどういう意味ですか? 彼の役割ということですか?では、基本的にユーザーはアプリケーション内でどのような役割を果たしているのでしょうか? それがロールの場合は、おそらく Authcookie に保存するのが適切な場所です。認証 Cookie に追加の値を追加したり、追加の値を考慮した独自の Authorize Attribute をロールしたりすることもできます。これにより、ユーザー プリンシパル オブジェクトで使用できるようになります。設定; } 文字列 FirstName { get; 設定; } 文字列 LastName { get; 設定; } 文字列 EmailAddress { get; 設定; } Guid CompanyID { get; 設定; } }

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

    public CustomPrincipal()
    {

    }

    public CustomPrincipal(IIdentity indentity)
    {
        this.Identity = new GenericIdentity(indentity.Name);
    }
    public CustomPrincipal(string email)
    {
        this.Identity = new GenericIdentity(email);
    }
   public Guid UserID { get; set; }
   public string FirstName { get; set; }
   public string LastName { get; set; }
   public string EmailAddress { get; set; }
   public Guid CompanyID { get; set; }
   public string CompanyName { get; set; }
   public string JobTitle { get; set; }


}`.


 public sealed class CustomAuthoriseAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        bool isAuthorized = base.AuthorizeCore(httpContext);
        if (!isAuthorized) return false;

        CustomPrincipal customPrincipal = null;
        HttpCookie authCookie = httpContext.Request.Cookies[FormsAuthentication.FormsCookieName];

        if (authCookie != null)
        {
            FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);
            var serializer = new JavaScriptSerializer();

            if (authTicket != null)
            {
                var serializeModel = serializer.Deserialize<CustomPrincipalSerializeModel>(authTicket.UserData);

                customPrincipal = new CustomPrincipal(authTicket.Name)
                {
                    UserID = serializeModel.UserID,
                    FirstName = serializeModel.FirstName,
                    LastName = serializeModel.LastName,
                    CompanyID = serializeModel.CompanyID,
                    EmailAddress = serializeModel.EmailAddress,
                    CompanyName = serializeModel.CompanyName,
                    JobTitle = serializeModel.JobTitle,

                };
            }
        }


                 HttpContext.Current.User = customPrincipal;

        return isAuthorized;
    }
}

public  class CustomPrincipalSerializeModel
{
  public Guid UserID { get; set; }
  public string FirstName { get; set; }
  public string LastName { get; set; }
  public string EmailAddress { get; set; }
  public Guid CompanyID { get; set; }
  public string CompanyName { get; set; }
  public string JobTitle { get; set; }

}

次に、ログイン方法は次のようになります

 if (!membershipService.IsAccountLockedOut(loginModel.Email) &&
            membershipService.Login(loginModel.Email, loginModel.Password))
        {
            UserDto user = membershipService.GetUserDetail(loginModel.Email);
            var cookieContext = new CookieContext();
            cookieContext.SetAuthenticationToken(user);
            //Need to check if user has reset thier password and needs to change it
            if (!user.PasswordReset)
            {
                return RedirectToLocal(returnUrl);
            }
            else
            {
                return RedirectToAction("ChangePassword", "Account");
            }
        }

Set Authentication Method は次のようになります。

public void SetAuthenticationToken(UserDto userDto)
    {
        string userData;
        string encTicket;

        var serializeModel = new CustomPrincipalSerializeModel();
        serializeModel.UserID = userDto.ID;
        serializeModel.FirstName = userDto.FirstName;
        serializeModel.LastName = userDto.LastName;
        serializeModel.EmailAddress = userDto.Email;
        serializeModel.CompanyID = userDto.CompanyID;
        serializeModel.CompanyName = userDto.Company;
        serializeModel.JobTitle = userDto.JobTitle;

        var serializer = new JavaScriptSerializer();
        userData = serializer.Serialize(serializeModel);

        var autTicket = new FormsAuthenticationTicket(1, userDto.Email, DateTime.Now,
                                                      DateTime.Now.AddMinutes(15), false, userData);
        encTicket = FormsAuthentication.Encrypt(autTicket);
        var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket);
        cookie.HttpOnly = true;
        HttpContext.Current.Response.Cookies.Add(cookie);
    }

アプリケーション全体でユーザーと一緒に移動する必要があるすべてのデータは、認証 Cookie で利用でき、CustomAuthorise 属性を使用するときはいつでも User オブジェクトで利用できます。

 [CustomAuthorise]
    [OutputCache(NoStore = true, VaryByParam = "*", Duration = 0)]
    public ActionResult Index()
    {

        var model = _someService.SomeFunction(User.CompanyID);  //Company ID is from Auth Cookie
        return View(model);
    }
于 2013-11-19T20:09:43.160 に答える