web-dev-qa-db-ja.com

ログインに成功した後、User.Identity.IsAuthenticatedはfalseです

ログインに成功したら、UserId Guidを直接取得する必要があります。次のコードは機能しません。

if (Membership.ValidateUser(txtUsername.Value, txtPassword.Value))
{
    FormsAuthentication.SignOut();
    FormsAuthentication.SetAuthCookie(txtUsername.Value, true);

    if (HttpContext.Current.User.Identity.IsAuthenticated)
    {
        // doesn't run
        Guid puk = (Guid)Membership.GetUser().ProviderUserKey;            
    }
}

次のコードは機能します:

if (Membership.ValidateUser(txtUsername.Value, txtPassword.Value))
{
    FormsAuthentication.SignOut();
    FormsAuthentication.SetAuthCookie(txtUsername.Value, true);

    MembershipUser user = Membership.GetUser(txtUsername.Value);

    if (user != null)
    {
        Guid puk = (Guid)user.ProviderUserKey;
    }
}

なぜこれが起こるのですか? SetAuthCookie以外にやることがありますか?

25
user982119

FormsAuthentication.SetAuthCookie(txtUsername.Value, true);を呼び出すと、クライアントのCookieにキーが格納されるためです。このためには、ユーザーに応答する必要があります。 HttpContext.Current.User.Identity Cookieを入力するには、もう1つのリクエストが必要です。

要するに、スキームは次のようになります。

  1. クライアントは、ユーザー名とパスワードを送信します。

  2. サーバーはそれを取得してチェックします。それらが有効な場合、サーバーはSet-Cookieクライアントへのヘッダー。

  3. クライアントはそれを受信して​​保存します。クライアントはリクエストごとにCookieをサーバーに送り返します。

@Jakeの更新

UserHttpContextを設定する例を追加

var identity = new System.Security.Principal.GenericIdentity(user.UserName);
var principal = new GenericPrincipal(identity, new string[0]);
HttpContext.Current.User = principal;
Thread.CurrentPrincipal = principal;  

GenericPrincipalまたはClaimsPrincipalから継承するカスタムプリンシパルクラスを作成できることに注意してください。

16
Oleksii Aza

私も同じ問題を抱えていました。 web.config構成を設定するのを忘れました。

たぶんあなたも見逃した。

   <system.web> 
    <authentication mode="Forms">
      <forms loginUrl="~/user/login" timeout="1000" name="__Auth" />
    </authentication>  
  </system.web> 
24
cihancoskun

私の開発環境の場合、requireSSLプロパティがtrueに設定されていたので、requireSSL = falseに変更して問題を修正しました。

enter image description here

1
doganak

上記のすべてのソリューションを試しましたが、私の問題を解決するのはweb.configでこれをコメントすることでした

 <modules>
  <remove name="FormsAuthentication"/>
 </modules>
1
Musab