こんにちは、カスタム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);
}
何か不足していますか?
FormsAuthentication.SetAuthCookie(tbUsername.Text, true);
bool x = User.Identity.IsAuthenticated; //true
string y = User.Identity.Name; //""
あなたが持っている問題は、この時点では認証Cookieを設定しているだけであり、フォーム認証モジュール内で作成されるIPrincipalは新しいリクエストがあるまで発生しないため、その時点でHttpContext.Userは奇妙な状態になります。リダイレクトが発生すると、ブラウザからの新しいリクエストであるため、ページに到達して正しいユーザーオブジェクトが作成される前にCookieが読み取られます。
Cookieは、リクエストが完了した後にのみブラウザに設定されます。
とにかくRedirectFromLoginPageはフォーム認証Cookieを作成するため、手動で行う必要はありません。
してみてください System.Web.HttpContext.Current.Request.LogonUserIdentity.Name
の代わりに User.Identity.Name
。それは私のために働いた。
HttpContext.Current.User.Identity.Name
の値は、RedirectFromLoginPage
の呼び出しによって設定されます。新しいページにリダイレクトされると、HttpContext.Current.User.Identity.Name
から現在のユーザーIDを取得できます。このコンテキストでUserプロパティを介してユーザー名にアクセスする必要がある理由がわかりません。tbUsername.Textに含まれる値を使用するだけではできませんか?
vS Community 2015バージョンでは、Webフォームアプリケーションを作成する場合、web.configノードにコードを自動的に追加してFormsAuthenticationを削除します。以下のセクションを削除してください
<modules>
<remove name="FormsAuthentication"/>
</modules>
すでに提案されているFormsAuthentication.RedirectFromLoginPage()
メソッドは、認証Cookieを自動的に設定します。
しかし、私の場合、<httpModules>
ファイルで子アプリケーションのweb.config
タグをクリアしたネストされたWebアプリケーションがありました(そのため、親アプリケーションからhttpModulesを継承しません)。不要な親httpModuleを削除すると、すべてが再び機能するようになりました。
物事を複雑にする前にこのタグをチェックする方が良い:)
URLの書き換えを使用している場合、またはURLを変更している場合、空のnull値が返されることがあります。URLのパスを.htmlから.aspxに変更するか、extensiontionを変更しないでください。これは私の場合の問題です。試してみてください。
メンバーシッププロバイダーからユーザーの名前を探している場合は、次のようなものを試してください...
var user = Membership.GetUser( HttpContext.Current.User.Identity.Name );