9

ユーザーの資格情報を確認し、それらが適切であることを確認した後、私はFormsAuthentication.SetAuthCookie("Username", false);ユーザーの認証に使用しています。

次に、マスターページでPage.User.Identity.IsAuthenticated、ゲストではなくログインしたユーザーを処理していることを確認するために使用します。

問題は、最初に認証Cookieを設定することにあります。認証Cookieを設定すると、その直後にPage.User.Identity.IsAuthenticated、一般的な「ようこそ、ゲスト!」からウェルカムメッセージを変更するために使用するメソッドを実行します。より個人的な「ようこそ、ユーザー名!」へのメッセージ メッセージ。これは別のページに移動するまで機能しないため、ログインプロセスは機能していることはわかっていますが、更新またはリダイレクトが発生するまで、必要な情報にアクセスできないようです。

Page.User.Identity.IsAuthenticatedメッセージを変更するために使用するために、認証Cookieを設定した後にユーザーをリダイレクトする必要がありますか?

4

2 に答える 2

6

私は以前にこれを見たことがありますので、答えはイエスです。(のように、はい、正しく使用するためにユーザーをリダイレクトする必要がありますPage.User.Identity.IsAuthenticated

私が想像しているのはIsAuthenticated、現在のリクエストを評価し、現在のリクエストが最初に届いたときに認証されていないものとして記録されたためです。

あなたがする必要があるのは、チェックせずに上記のメソッドにあるロジックを適用することですIsAuthenicated(それを真と仮定します)。

これに対処するためにリファクタリングする方法を提案する方法の詳細はわかりませんが、「Do Stuff」の部分を別の関数に分割して、ログイン関数から直接呼び出すことができます。認証チェックをバイパスします。


編集:私の仮定を裏付けるために、あなたはこのページを読むことができます。

興味深い部分:

フォーム認証チケットは、ブラウザによって行われた次のリクエストにフォーム認証情報を提供します。

于 2012-04-17T11:51:52.267 に答える
6

私はこれを回避する方法が実際にあることを指摘したいと思います(私はこれがこのような他の質問で言われるのを見たことがないので)。User.Identityの情報がリダイレクトされることなく、Cookieとそのデータを取得できます。問題は、Cookieがまだブラウザに送信されていないということです。

これは、FormsAuthenticationによって作成されたCookieをResponse.Cookiesオブジェクトから取得するだけです。

HttpCookie EncryptedCookie = Response.Cookies.Get(FormsAuthentication.FormsCookieName);
FormsAuthenticationTicket DecryptedCookie;
try {
    DecryptedCookie = FormsAuthentication.Decrypt(EncryptedCookie.Value);
} catch (ArgumentException) {
    // Not a valid cookie
    return false;
}
// DecryptedCookie.Name: The Username
// DecryptedCookie.UserData: Any additional data, as a string. This isn't normally used
return !DecryptedCookie.Expired;
于 2013-06-06T18:55:42.800 に答える