2009-06-29 14 views
23

こんにちは私はカスタムMembershipProviderを使用しています。HttpContext.Current.User.Identity.Nameは常にstring.Emptyです

アプリケーションのシナリオで現在のユーザー名を知りたいが、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); 
} 

何か不足していますか?

+0

そのコードは十分に簡単です。あなたはそのユーザーが認証されていると確信していますか?プロバイダを動的に変更するなど、面白いビジネスは何か? –

+0

funny bizniz ,,ユーザーは認証されました – Shimmy

+0

認証CookieでFormsAuthentication.SetAuthCookieでユーザー名を設定しましたか? –

答えて

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

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

クッキーは、要求が完了した後でのみブラウザに設定されます。余談RedirectFromLoginPageはとにかくフォーム認証Cookieを作成したよう

、手動で

+0

これは良い点です。同じページでユーザー名をテストしていますか?クッキーを設定する/ログインしますか?その場合は、*後続の*ページでHttpContext.Current.User.Identityをチェックしてください。 –

+0

非常に良い答え。しかし、これは私の問題で私を助けません。私は、ユーザーの役割に基づいて特定のページにユーザーをリダイレクトできるようにしたい。管理者パネルに直接アクセスする管理者、通常のユーザーからページを歓迎するユーザー、特定の他のページへの上級ユーザー... User.IsInRole()を使用してLogOnアクションメソッドのActionResultを決定することを望みましたが、あなたがそれを置くように、奇妙な状態 ": –

0

あなたはメンバーシッププロバイダーからユーザーの名前を探しているなら、このような何かをしようとは...

var user = Membership.GetUser(HttpContext.Current.User.Identity.Name); 
+2

ユーザー名ではなくユーザーが必要な場合は、単にMembership.GetUser()を使用できます。 :<| – Shimmy

8

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

19

System.Web.HttpContext.Current.Request.LogonUserIdentity.Nameの代わりUser.Identity.Nameを試してみてください、それを行う必要はありません。それは私のために働いた。

+1

これは別のものです。私のウェブサイトでこの値を読むと、私はWindowsアカウント(AD)を取得します... – Jowen

+1

User.Identity.Nameが空であり、LogonUserIdentity.Nameがそうではないと思われる場合は、問題が発生する可能性がありますVisual Studioからデバッグする場合は、applicationhost.configを使用してください。詳細は私のSOの質問を参照してください。 http://stackoverflow.com/questions/19686933/logonuseridentity-name-vs-user-identity-name/19689343#19689343 – Jagd

+0

私はJowenに同意します..それは同じものではありません。それは私が考えているアクセス可能なクールです。 – ppumkin

1

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

私の場合、私はweb.configファイルの子アプリケーションで<httpModules>タグをクリアしたので(親アプリケーションからhttpModulesを継承しないように)ネストされたWebアプリケーションを持っていました。不要な親httpModulesを削除すると、すべてが再び機能しました。あなたはURL書き換えを使用したり、URLを変更している場合は、物事を複雑にする前に、このタグをチェックする

その優れた:)

0

、それはvalue.YouからあなたのURLの変更パスを試してみてください原因復帰空nullの場合もあります。 htmlから.aspxまで、または拡張なし。これは私の場合の問題です。あなたが試してみてください。

2

VS Community 2015バージョンでは、Webフォームアプリケーションを作成すると自動的にForms.Authenticationを削除するコードが追加されます。以下のセクションを削除してください。

関連する問題