Formsアイデンティティ認証IE 11でCookieを保存できない問題

4861 ワード

ASP.NETでForms認証を使用する一般的な方法は次のとおりです.
1.サイトのルートの下のWeb.config authenticationノードの追加
 
  




2.managerサブディレクトリの下にWebを追加する.configファイルに次の内容を追加します.
 
  










これにより、ユーザはForms認証なしでmanagerサブディレクトリの下のどのページにアクセスしても自動的にmanager/LOginにジャンプする.aspxページ.認証に成功すると、デフォルトではmanager/defaultに戻ります.aspxページ.認証の有効期間は60分です.
3.認証コードを追加します.ログインボタンに次のコードを追加します.
 
  
if (!snCheckCode.CheckSN(txt_ValidateCode.Text))
{
snCheckCode.Create();
Utility.ShowMessage(" !");
return;
}

string strUserName = txt_Username.Text.Trim();
string md5Pwd = Helper.MD5ForPHP(Helper.MD5ForPHP(txt_Password.Text));
lc_admin admin = null;
bool logined = false;

using (var context = new dbEntities())
{
admin = context.tb_admin.Where(n => n.username == strUserName).FirstOrDefault();

if (admin != null)
{
if (admin.checkadmin != "true")
{
snCheckCode.Create();
Utility.ShowMessage(" , !");
return;
}

if (admin.password == md5Pwd)
{
// Update Admin Info
admin.loginip = Request.UserHostAddress.ToString();
admin.logintime = CndingUtility.DateTimeToUnixTimeStamp(DateTime.Now);
context.SaveChanges();

logined = true;
}
}
}

if (logined)
{
// Login
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
1,
admin.id.ToString(),
DateTime.Now,
DateTime.Now.AddMinutes(60),
false,
"Admin",
FormsAuthentication.FormsCookiePath
);
string hashTicket = FormsAuthentication.Encrypt(ticket);
HttpCookie userCookie = new HttpCookie(FormsAuthentication.FormsCookieName, hashTicket);
HttpContext.Current.Response.Cookies.Add(userCookie);

if (Request["ReturnUrl"] != null)
{
Response.Redirect(HttpUtility.HtmlDecode(Request["ReturnUrl"]));
}
else
{
Response.Redirect("/manager/default.aspx");
}
}
else
{
snCheckCode.Create();
CndingUtility.ShowMessage(" !");
}

MD 5暗号化コード:
 
  
public static string MD5ForPHP(string stringToHash)
{
var md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
byte[] emailBytes = Encoding.UTF8.GetBytes(stringToHash.ToLower());
byte[] hashedEmailBytes = md5.ComputeHash(emailBytes);
StringBuilder sb = new StringBuilder();
foreach (var b in hashedEmailBytes)
{
sb.Append(b.ToString("x2").ToLower());
}
return sb.ToString();
}

認証が成功すると、デフォルトではユーザー登録情報がCookie形式でクライアントに保存され、有効期間は60分です.UserDataはユーザーの役割として設定されており、ユーザーがログインしているかどうかを判断する際に使用されます.次のコードに従います.
 
  
if (HttpContext.Current.User.Identity.IsAuthenticated)
{
int adminId = -1;
FormsIdentity identity = (FormsIdentity)HttpContext.Current.User.Identity;
FormsAuthenticationTicket ticket = identity.Ticket;
string userData = ticket.UserData;
if (userData == "Admin")
{
// To do something
}
}

上記のコードはVisual Studioですべて正常に動作します.ただし、サーバのIIS(IIS 6などの低バージョンのIIS)にWebサイトを公開すると、ログイン機能に異常が発生します.ユーザー名とパスワードを入力してログインボタンをクリックすると、ページpostbackが正しくジャンプできず、保護されたページに手動でアクセスしようとすると自動的にログインページにジャンプします.さらに奇妙なことに、この問題はIE 11ブラウザにのみ表示され、FirefoxまたはChromeアクセスログイン機能で正常に動作しています.一応IIS設定の問題かと思いましたが、IIS 6にはCookieに関する設定はありません.IIS 7にはこの設定があったのを覚えているようです.ただし、この問題はIE 11のみであるため、コード自体に何らかの問題があることは否定できる.
また、IE 11のセキュリティレベルを下げる、サーバに再インストールを試みた.Netframeworkや最新のパッチのダウンロードなど、問題は解決できません.簡単に修正するだけだということに気づきましたconfigのauthenticationノードの設定でいいので、formsにcookieless=「UseCookies」属性を追加すればいいです.
 
  




Cookieを使用してユーザー認証情報を保存することをサーバに明確に伝えるために使用します.問題解決!