webdevqa.jp.net

HttpContext.Current.User.Identity.Nameは常にstring.Emptyです

こんにちは、カスタムMembershipProviderを使用します。

アプリケーションシナリオ中に現在のユーザー名を知りたいのですが、HttpContext.Current.User.Identity.Nameにアクセスしようとすると、常にstring.Emptyが返されます。

if (Membership.ValidateUser(tbUsername.Text, tbPassword.Text))
{
    FormsAuthentication.SetAuthCookie(tbUsername.Text, true);
    bool x = User.Identity.IsAuthenticated; //true
    string y = User.Identity.Name; //""
    FormsAuthentication.RedirectFromLoginPage(tbUsername.Text, cbRememberMe.Checked);
}

何か不足していますか?

26
Shimmy
FormsAuthentication.SetAuthCookie(tbUsername.Text, true);
bool x = User.Identity.IsAuthenticated; //true
string y = User.Identity.Name; //""

あなたが持っている問題は、この時点では認証Cookieを設定しているだけであり、フォーム認証モジュール内で作成されるIPrincipalは新しいリクエストがあるまで発生しないため、その時点でHttpContext.Userは奇妙な状態になります。リダイレクトが発生すると、ブラウザからの新しいリクエストであるため、ページに到達して正しいユーザーオブジェクトが作成される前にCookieが読み取られます。

Cookieは、リクエストが完了した後にのみブラウザに設定されます。

とにかくRedirectFromLoginPageはフォーム認証Cookieを作成するため、手動で行う必要はありません。

34
blowdart

してみてください System.Web.HttpContext.Current.Request.LogonUserIdentity.Name の代わりに User.Identity.Name。それは私のために働いた。

23
sathya

HttpContext.Current.User.Identity.Nameの値は、RedirectFromLoginPageの呼び出しによって設定されます。新しいページにリダイレクトされると、HttpContext.Current.User.Identity.Nameから現在のユーザーIDを取得できます。このコンテキストでUserプロパティを介してユーザー名にアクセスする必要がある理由がわかりません。tbUsername.Textに含まれる値を使用するだけではできませんか?

8
Phaedrus

vS Community 2015バージョンでは、Webフォームアプリケーションを作成する場合、web.configノードにコードを自動的に追加してFormsAuthenticationを削除します。以下のセクションを削除してください

<modules>
  <remove name="FormsAuthentication"/>
</modules>
2
Bo Hu

すでに提案されているFormsAuthentication.RedirectFromLoginPage()メソッドは、認証Cookieを自動的に設定します。

しかし、私の場合、<httpModules>ファイルで子アプリケーションのweb.configタグをクリアしたネストされたWebアプリケーションがありました(そのため、親アプリケーションからhttpModulesを継承しません)。不要な親httpModuleを削除すると、すべてが再び機能するようになりました。

物事を複雑にする前にこのタグをチェックする方が良い:)

1
Bravo

URLの書き換えを使用している場合、またはURLを変更している場合、空のnull値が返されることがあります。URLのパスを.htmlから.aspxに変更するか、extensiontionを変更しないでください。これは私の場合の問題です。試してみてください。

0
Hoang Quan

メンバーシッププロバイダーからユーザーの名前を探している場合は、次のようなものを試してください...

var user = Membership.GetUser( HttpContext.Current.User.Identity.Name );
0
JP Alioto