ログインに成功したら、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
以外にやることがありますか?
FormsAuthentication.SetAuthCookie(txtUsername.Value, true);
を呼び出すと、クライアントのCookieにキーが格納されるためです。このためには、ユーザーに応答する必要があります。 HttpContext.Current.User.Identity
Cookieを入力するには、もう1つのリクエストが必要です。
要するに、スキームは次のようになります。
クライアントは、ユーザー名とパスワードを送信します。
サーバーはそれを取得してチェックします。それらが有効な場合、サーバーはSet-Cookie
クライアントへのヘッダー。
クライアントはそれを受信して保存します。クライアントはリクエストごとにCookieをサーバーに送り返します。
@Jakeの更新
User
にHttpContext
を設定する例を追加
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
から継承するカスタムプリンシパルクラスを作成できることに注意してください。
私も同じ問題を抱えていました。 web.config構成を設定するのを忘れました。
たぶんあなたも見逃した。
<system.web>
<authentication mode="Forms">
<forms loginUrl="~/user/login" timeout="1000" name="__Auth" />
</authentication>
</system.web>
上記のすべてのソリューションを試しましたが、私の問題を解決するのはweb.configでこれをコメントすることでした
<modules>
<remove name="FormsAuthentication"/>
</modules>