2017-11-23 15 views
2

Visual Studio 2013にIIExpress(バージョン8.08418.0)でローカルに実行されているASP.NETプロジェクトがテスト用に用意されています。Response.Redirectは失敗しますが、IIS Expressを最新の状態に更新するVS2013

メインページ(adminDefault.aspx)は、認証するためにユーザーをLogin.aspxにリダイレクトします(adminDefault.aspxにURL変数として渡されたuserIDに基づいて自動的に行われます)。ログインページは、認証に成功するとadminDefault.aspxにそれを戻します。デフォルトでは、データがGridviewにロードされます。

全体の処理には約15秒かかります。

これをVisual Studio 2013から実行すると、約4秒で "このページを表示できません"というエラーが表示されます。しかし、私が手作業でリフレッシュすると、ちょっとした作業の後、すべてがうまくいきます。私のコードで

Showing Failure

、タイムアウトを疑う、私は暗黙のうちに十分な長さのすべてを介して実行するために、これを設定します。

if (!this.IsPostBack) 
      { 

       Session.Timeout = 120; // seconds before timeout 
       try 
       { 
        // OnUser should have been set from Login.asp. If it is null, send to Login 
        MembershipUser onUser = Membership.GetUser(); 
        if (onUser == null) 
        { 
         Response.Redirect("/login.aspx", true); 
        } 
        else 
        { 
         String currentUserName = Membership.GetUser().UserName; 
         userRoles = Roles.GetRolesForUser(Membership.GetUser().UserName); 
        } 
       } 

Session.Timeoutは無視されている場合でも、デフォルトは20秒です私はそれがとにかく働くことを期待するでしょう。

So: 1)最初の実行に失敗したのはなぜですか? 2)私はそれを防ぐ方法がありますか?見つからないページをキャッチして自動的にリフレッシュできますか?

編集:これはLogin.aspxへの旅行と関係があります。削除した場合Response.Redirect("/login.aspx", true); これは期待どおりに動作します。問題は、検証のためにLogin.aspxが必要なことです。誰でもログインとバックへの旅行がうまくいかない理由について考えてみてください...そしてリフレッシュするとどうなりますか?

これをChromeで実行しようとすると、私は遠くには行かない。一瞬のためにここにだけのサイクルを叩く

enter image description here

とバックスクリーンに来る:Chromeは私にこのことを示しています。

IEの開発者ツールは、このケースでは(少なくとも私が見ることは)役に立ちません。デバッガでプロジェクトを実行すると、新しいIEセッションが開始されます。開発ツールを有効にしてイベントを記録するために「再生」を押す前に、セッションで「ページを表示できません」というエラーが表示されました。もちろん、私はツールで "再生"してからリフレッシュすることはできますが、もちろんすべてがエラーなく実行されます。リフレッシュによってすべてが正しく実行されます。それ以前になぜ失敗するのかを知る必要があります。

EDIT:これはLogin.aspxとWeb.Security Codeです。私はそれを書いていないが、それは定型になります

protected void Page_Load(object sender, EventArgs e) 
    { 
      string userName = ""; 
      bool authenticated = FormsAuthentication.Authenticate(ref userName); 
      if (authenticated) 
       { 
        FormsAuthentication.RedirectFromLoginPage(userName, false); 
       } 
    } 

そして、認証コードは次のようになります。あなたは誰を想定しているなステートメントは、どちらかである場合、私はあなたの初期に考える

 /// <summary> 
    /// Validates a user based on the session id found in the ReturnURL against credentials stored in the ASP.NET membership. 
    /// </summary> 
    /// <param name="userName">The user name.</param> 
    /// <returns>true if the user name and password are valid; otherwise, false.</returns> 
    public static bool Authenticate(ref string userName) 
    { 
     bool Authenticated = Authenticate(ref userName, GetSessionId()); 
     return Authenticated; 
    } 

    /// <summary> 
    /// Redirects an authenticated user back to the originally requested URL or the default URL using the specified cookie path for the forms-authentication cookie. 
    /// </summary> 
    /// <param name="userName">The authenticated user name. </param> 
    /// <param name="createPersistentCookie">true to create a durable cookie (one that is saved across browser sessions); otherwise, false. </param> 
    /// <param name="strCookiePath">The cookie path for the forms-authentication ticket. </param> 
    public static void RedirectFromLoginPage(string userName, bool createPersistentCookie, string strCookiePath) 
    { 
     System.Web.Security.FormsAuthentication.SetAuthCookie(userName, false, strCookiePath); 

     // Redirect back to request page. 
     HttpContext.Current.Response.Redirect(GetRedirectUrl()); 
    } 
+0

これを確認しましたか:https://stackoverflow.com/questions/18839409/asp-net-page-cant-be-displayed-error ???またはこれは:https://stackoverflow.com/questions/18706173/how-to-fix-this-page-cant-be-displayed-error-in-asp-net ??? – JCM

+0

はい。どちらも適用されません。私はHttps(最初のリンクソリューション)を使用していません、そして、2番目のケースでは、それはlocalhostで動作しましたが、デプロイメントでは動作しませんでしたが、私の問題はlocalhostで発生します。 – MarkJoel60

+0

ソリューションを展開するときに同じ問題がありますか? – JCM

答えて

1

ログインしていないかログインしていません。ログインしていないユーザーやそのユーザーは匿名(?)でもかまいません。あなたがしたいことは、このadmin.Deaultページを保護し、許可されたユーザーだけを許可することです。現在のところ、2つの条件がユーザーをログインに戻します。ユーザー=ヌルまたはロールを取得した場合は、aspxページ(現在のユーザー)。 認証は、権限がすべてリソースへのアクセスに関するユーザーであることを知ることです。権限のあるユーザーのみがそのリソースにアクセスするようにします。

AdminDefault.aspx、admin.Default.csおよびadmin.Default.designer.csをAdminSecureという独自のフォルダに配置します。その後、そのフォルダ内に追加した後、右クリックしてWeb.configファイルを追加します。そのWeb.configでは、匿名ユーザーを拒否する必要があります。そのため、AdminDefaultページにアクセスしようとすると自動的にリダイレクトされます。

//ログインしていないユーザーを拒否しますか? ==匿名

<xml version="1.0"?> 
<configuration> 
    <system.web> 
<authorization> 
    <deny users="?"/> 
</authorization> 
    </system.web> 
</configuration> 


//this can allow particular users 
<allow users="[email protected]"/> 

//deny everyone but one user: 
<allow users="[email protected]"/> 
<deny users="*"/> 

これは役に立ちます。

+0

これは内部のWebサイトです。匿名ユーザーは許可しないでください。管理者は、実際にはuserIDを渡すERPシステムから呼び出されます。Login.aspxは、内部データベースに対して、ログインが許可されているかどうかを確認します。症状は、ログインを通過しているように見えますが、管理ページはロードされる前に失敗しています。それをリフレッシュするとOKになります。それは前後にピンポンをかけているようには見えません。それはあまりにも迅速に失敗します。 – MarkJoel60

+0

クロム開発者ツールのネットワーキングタブで、リクエストヘッダーとレスポンスヘッダーをコピーして投稿する必要があります。あなたが投稿したコードの中でuserIdが渡されるパラメータは表示されません。 userIDが取得されている場所のパスをパラメータとして指定します。それ以降に起こることをよく見てください。私は正直言って、より多くの情報を必要とします。 –

0

コメント内のアプリケーション状況に基づいて、web.configで認証/承認を管理することはできません。そして、Membershipクラスは通常、カスタムプロバイダーを持っている場合にアクセスされます。ログインしているユーザーにアクセスするデフォルトの方法ではありません。だから、それらのいずれかん:

  1. はあなたif文の次の方法でログインしているユーザーを確認します。

    if (User.Identity.IsAuthenticated) 
    { 
        Response.Redirect("/login.aspx", true);   
    } 
    else 
    { 
        String currentUserName = Use User.Identity.Name; // accessing the logged in uer 
        userRoles = Roles.GetRolesForUser(currentUserName); // not sure about this step, have you added your roles to web.Config? or from where you get them 
    } 
    
  2. はあなたのERPは(あなたが使用する必要がありますあなたのアプリと統合する方法に依存しますカスタムプロバイダー)では、ユーザーが認証される場所を確認します。 (例。Membership.ValidateUser(strUsername,strPassword)を呼び出す。そして、あなたのlogin.aspxのページには、セッション状態を更新していることを確認している。

Login.aspxのはadminDefaultにリダイレクトする場合は、カスタムプロバイダ

+0

私はあなたが何かにいると思います。私が言ったように、私はこのコードを継承しました。ログインページへの呼び出しはここではいくぶん難しいと思われます。しかし、これを拡張することができます: "あなたのlogin.aspxページがセッション状態を更新していることを確認してください。"認証クッキーを設定します。 (上記の新しい編集を参照してください)これはあなたの意味ですか? – MarkJoel60

1

の実装の詳細情報を確認this page .aspxのそれはあなたのブラウザにセッションを永続化するために取得する前に、無限のリダイレクトループが発生します

私の手がかり:

1)あなたは既にリダイレクトループを持っているとして - 意図的に無限ではないが - 。

2)タイムアウトが発生している可能性がありますが、サーバー側のタイムアウトは無視されます。クライアント側で発生すると考えられます。お使いのブラウザの安全対策として

3をリダイレクトループを壊す)リフレッシュができます:あなたのセッションは、クライアント側

4永続化された後に、これはリダイレクトループを壊す)adminDefault.aspxにあなたのリダイレクトを削除することができます:これをするだけでなく無限ループを解除しますが、リダイレクトループの概念は削除します

リダイレクトループの理論をテストするには、いくつかのことがあります。

1)ブレークポイントをSession.Timeout = 120;に設定して、そこからどこに行くのかを確認します。あなたは一度だけResponse.Redirect("/login.aspx", true);に得ることを期待しますが、おそらく

または )がFiddlerをインストールしてリダイレクトを監視する(一回あたりのリダイレクト)この行が連続ヒットしているが表示されます。

上記の理論が正しい場合は、adminDefault.aspxにリダイレクトする前にLogin.aspxがセッションをブラウザに保持するようにする必要があります。つまり、adminDefault.aspxへのリダイレクトを試み、Login.aspxにリダイレクトした後にセッションCookieを取得したかどうかを確認します。そうでない場合は、あなたの疑いがあります。要するに、Login.aspxは、adminDefault.aspxにリダイレクトされる前に作業が完了していないので、そのまま放置する必要があります。私はLogin.aspxコードなしでは、もっと具体的にすることはできません。

+0

私はLogin.aspxとWeb.Securityのコードを含んでおり、認証とリダイレクトのためのログイン呼び出しを示しています。 (上の編集を参照してください)これは役に立ちますか? – MarkJoel60

+0

ロジックが正常に見え、セッションクッキーを保持する必要があります(確認できますか?)。 Authenticate(ref userName、GetSessionId())で何かが間違っているはずなので、userNameは空になります。どちらの資格も渡されることはありません。これは注目に値するものです。 –

+0

UserNameがFormsAuthentication.RedirectFromLoginPageになると、値が返されます。クッキーの作成方法を確認する方法がわかりません。しかし、渡される値は実際には偽であるため、永続化されているとは思われません。 – MarkJoel60

関連する問題