FormsAuthenticationを使用してユーザーを登録およびログオンするカスタムメソッドを使用するこのアプリケーションがあります。これがホストされているサーバーには、15分ごとにセッションを再開するポリシーがあり、その時にすべてのユーザーがログアウトします。ユーザーをlogginするコードは次のとおりです。作成したフォームクッキー付きと基本的にユーザーがパスワードをハッシュ化されて、私は[ログイン]ボタンまたはユーザ名を表示するには、次のロジックを使用して、私の認証データ、とセッションが再開したときにユーザーがログアウトするのはなぜですか?
var user = this.accountRepo.GetUser(id);
// Create the forms authentication cookie
var cookieValue = user.name;
HttpCookie cookie = FormsAuthentication.GetAuthCookie(cookieValue, true);
// Dercrypt the cookie
FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(cookie.Value);
// Create a new ticket with the desired data
FormsAuthenticationTicket newTicket = new FormsAuthenticationTicket
(
ticket.Version,
ticket.Name,
ticket.IssueDate,
DateTime.Now.AddYears(1),
true,
user.Authentication
);
// Update the cookies value
cookie.Value = FormsAuthentication.Encrypt(newTicket);
Response.Cookies.Set(cookie);
accountRepo.Login(user);
:
@{
var accountRepo = new AccountRepository();
var user = accountRepo.GetCurrentUser();
}
@if(user != null && user.LoggedIn) {
<div>@Html.ActionLink(Context.User.Identity.Name + " - Logout", "LogOff", "Account", null, new { @class = "logout_link" })</div>
}
else
{
@Html.ActionLink("Login", "Login", "Account", new { returnUrl = Request.Url.AbsoluteUri }, new { @class = "login_link" })
}
そして "GETCURRENTUSER()" メソッドということである。
var cookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
if (cookie != null)
{
FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(cookie.Value);
return db.Users.SingleOrDefault(u => u.Authentications.Equals(ticket.UserData, StringComparison.CurrentCultureIgnoreCase));
}
return null;
は、私がここで何かが足りないのですか?このコードでは、セッションが再開した場合、ユーザーはログインしたままにしておく必要があります。
ありがとうございます。
うわー、そんなにここで間違っている私はどこから始めるべきか知らない。あなたのビューでリポジトリをインスタンス化する??? Eeeeeevil。問題は、セッションが失われたときにcookienameが変更され、新しいセッションが生成されることです。ユーザーのパスワードをクッキーに保存すると、たとえ暗号化されハッシュされていても、悪い悪い悪い考えです。 –
それについて教えてください、それは私とサーバーに対して強硬でした – FelixMM
これはひどいことではありませんが、これはちょっとしたコードですが、あなたはリファクタリングできるはずです。リファクタリングに関するヘルプが必要な場合は、さらに質問を投稿してください。これは、これを維持するか、単に読む必要があるかもしれない人々にとって不公平です。 –