0

この機能を実装する方法について、私はかなり混乱しています。最初に、ユーザーが Web サイトにアクセスすると、サインイン ページが表示されます。

[HttpGet]
public ActionResult SignIn()
{
  return View() ;
}

ユーザーが詳細を入力すると、以下が呼び出されます。

[HttpPost]
public ActionResult Sign(SignInModel signInModel)
{
   if(service.ValidateUser(signInModel.userName,signInModel.passWord))
    {
        FormsAuthentication.SetAuthCookie(signInModel.userName, true);return           
        return RedirectToAction("Index", "Home");
    } 
}

ただし、テストとして、ログインページに戻ることにしたので、localhost/Account/SignInですが、ホームページにリダイレクトされません.. SOからの同様の質問に対するいくつかの提案された回答を試しました:

[HttpGet]
public ActionResult SignIn()
{
  if(HttpContext.User.Identity.IsAuthenticated) 
  {
            return RedirectToAction("Index", "Home");
  }
  return View() ;

}

しかし、それがどのように機能するのか理解できなかったので、デバッグすることにしました。しかし、間違った を使用していたことが判明しましたIdentity

説明するために、私はデフォルトの MVC テンプレートを使用してプロジェクトを機能させていました。そのテンプレートに James でログインしました。しかし、私自身のプロジェクトでは、Peter でログインしました。

しかし、私のプロジェクトでは、 PeterではなくHttpContext.User.Identityデフォルト Web サイトの James を参照しています。

TL;DR StackOverflow のような情報を保持するにはどうすればよいですか? セッションの有効期限が切れたとき、またはユーザーがサインアウトしたときにのみ、サインイン ページが表示されます。

4

2 に答える 2

1

正しく理解していない場合は訂正してください。

  • ローカルホストで両方のウェブサイトをホストしています。ほとんどの場合、異なるポート番号です。
  • 最初にダミーのWebサイト(テンプレートWebサイト)にログインしました。認証Cookieを取り戻しました。
  • ダミーのWebサイトからログアウトしませんでした。したがって、認証Cookieは引き続き有効です。
  • 次に、実際のWebサイト(プロジェクト)を立ち上げました。サインインページをリクエストすると、以前に受信したCookieもサーバーに送信されます。これが発生する理由は、Cookieがドメインlocalhostとアプリパスにスコープされているためです\。これは両方のWebサイトに一致します。
  • あなたは自分自身がログインしているように、そして他の誰かとして見ています。

これを修正するために何ができますか?

両方のWebサイトからログアウトします。ダミーのWebサイトにログインしないでください。実際のWebサイトにログインします。楽しむ。

より恒久的な修正?

依存します。この問題は、Cookieのスコープが緩すぎるために発生します。で両方のWebサイトを実行する必要がある場合はlocalhost、フォルダの下でそれらを起動するようにIDEを構成できます。意味ダミーウェブサイトはで立ち上げられhttp://localhost:1234/dummy/、実際はで立ち上げられhttp://localhost:4321/actualます。通常のCookieの場合、パスを直接設定します。認証Cookieには、このメソッドを使用できますFormsAuthentication.GetAuthCookie

src:http ://telligent.com/support/telligent_evolution_platform/w/documentation/common-things-to-check-when-using-forms-authentication.aspx

HttpCookie cookie = FormsAuthentication.GetAuthCookie(username, true);
cookie.Path = "/dummy";
Response.Cookies.Add(cookie);

編集:

一般的なコンセンサスは、パスを設定しないことのようです。https://stackoverflow.com/a/6940281/30007

Cookieパスでは大文字と小文字が区別されるため、次のようになります。

http://site/path
http://site/PATH

ブラウザ用の2つの異なるCookieがあります-それらのいずれも(IE、FX、Safari、Opera、またはChrome)/PATHのCookieを/pathに送信することはありません。

于 2012-11-24T16:03:44.253 に答える
0

あなたが探しているものはそこに答えがあると思います: How do I redirect /Home to root?

編集:

returnUrlこの場合、これを試してください: LogOn リンクを生成するときに、パラメーターを渡したい場合があります。

@Html.ActionLink("Log On", "LogOn", "Account", new { returnUrl = Request.Url }, null)

あなたの特定のケースでは、returnUrlホームページになることができます。混乱させて申し訳ありません。

お役に立てれば

于 2012-11-24T15:39:11.867 に答える