4

友達のコードを修正しています。また、マスターページのセッション値に問題があります。マスターページでセッションがnullまたは空であることを確認しています。nullの場合はログインページに移動します。ただし、masterpageによって作成された他のページは機能しません。

if (Session["user"] != null && Session["user"] != "")
{ }
else
{
    Response.Redirect("/Account/Login.aspx?link=" + System.Web.HttpContext.Current.Request.Url.PathAndQuery);
}

Session ["user"]。ToString()で試しましたが、同じ結果になりました。

また、他のページにはこのセッションを介した他のコントロールがあるため、ログインしていない場合は常にエラーが発生します。

<%@ Page Title="" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true"
    MaintainScrollPositionOnPostback="true" CodeFile="document.aspx.cs" Inherits="document" %>
4

5 に答える 5

6

これに基づいて:

しかし、back.masterのpage_loadのセッション制御はdefault.aspx page_loadの後に起動するため、「セッションはnullです」というエラーが表示されます。

ここでの根本的な問題は単純です... ASP.Netページのライフサイクルを完全に理解する必要があります

ざっと見てみましょう:

ここに画像の説明を入力してください

基本的に、次の仮定は間違っています。

次に、名前がdefault.aspxで、back.masterから派生した通常のaspxページを作成します。

MSDNから:

マスターページは、ページ上の子コントロールのように動作します。マスターページのInitイベントは、ページのInitイベントとLoadイベントの前に発生し、マスターページのLoadイベントは、ページのInitイベントとLoadイベントの後に発生します。

悲しいことに、ASP.Netはマスターページから派生していません。なぜですか?マスターページはコントロールとして扱われるため、実際に発生するのは、マスターページがの子コントロールであるということです。Page

代替案:

  • ユーザーが認証されているかどうかを確認しているので、ASP.Net認証および承認APIに依存する方がよいでしょう。

回避策(独自の認証メカニズムを使用することを主張する場合):

  • (最適な推奨事項)カスタムを作成し、そこでオブジェクトHttpModuleを確認しSessionます。あなたのニーズに最適なイベントは次のとおりApplication_AuthenticateRequestです。これは、選択できるイベントの完全なリストです:(ところで、新しいHttpModuleを作成する必要はありません。WebアプリケーションのGlobal.asaxファイルを使用してイベントをサブスクライブできます。HttpModuleをカプセル化する場合にのみ使用してください。それを再利用するロジック)

    • Application_BeginRequest。
    • Application_AuthenticateRequest。
    • Application_PostAuthenticateRequest。
    • Application_DefaultAuthentication。
    • Application_AuthorizeRequest。
    • Application_PostAuthorizeRequest。
    • Application_ResolveRequestCache。
    • Application_PostResolveRequestCache。
    • Application_MapRequestHandler。サーバーがIIS7を統合モードで実行していて少なくともNetFramework3.0を実行している場合にのみ発生します
    • Application_PostMapRequestHandler。
    • Application_AcquireRequestState。
    • Application_PostAcquireRequestState。
    • Application_PreRequestHandlerExecute。
    • ページイベントハンドラーが実行されます。(ページのライフサイクルを参照してください)
    • Application_PostRequestHandlerExecute。
    • Application_ReleaseRequestState。
    • Application_PostReleaseRequestState
    • Application_UpdateRequestCache。
    • Application_PostUpdateRequestCache
    • Application_LogRequest。サーバーがIIS7統合モードで少なくとも.NetFramework3.0の場合にのみ発生します
    • Application_PostLogRequest。サーバーがIIS7統合モードで少なくとも.NetFramework3.0の場合にのみ発生します
    • Application_EndRequest。

    詳細情報:

  • orイベントから継承する汎用ページを作成し、Pageそこにチェックコードを配置すると、両方のイベントが機能し、最終的にこのページからすべてのページを継承しますPreLoadLoad

  • Init(非推奨)マスターページ内にチェックをカプセル化する場合は、イベントを使用できます

于 2012-07-17T08:05:25.420 に答える
1

修正:問題は解決します。

protected void Page_Init(object sender, EventArgs e)
{
    if (Session["master"] != null)
    { }
    else
    {
        Response.Redirect("login.aspx?link=" + System.Web.HttpContext.Current.Request.Url.PathAndQuery);
    }
}
于 2012-07-18T05:48:30.890 に答える
1

IISには、認証と承認のための標準的な方法があります。

ユーザーがログインしていない場合にWebサイトの特定の領域へのアクセスを制限する場合は、構成に次のメカニズムがあります。

web.configに、次を追加できます。

<location path="LoginRequiredDir">
  <system.web>
     <authorization>
        <deny users="?"/>
     </authorization>
  </system.web>
</location>

これにより、ユーザーがログインしていない場合、ユーザーは自動的にログインページに移動します。

于 2012-07-17T07:25:12.780 に答える
1

私も同様の問題に直面していました。残りのロードが終了するように、この方法に慣れtrueました。Ref。マスターページのセッション値を以下のように確認しました。Response.RedirectPage_Init

public partial class Dashboard : System.Web.UI.MasterPage
{
    protected void Page_Init(object sender, EventArgs e)
    {
        if (Session["RoleId"] == null || Session["RoleId"].ToString() == "")
        {
            Response.Redirect("/account", true);
        }
    }
    protected void Page_Load(object sender, EventArgs e)
    {

        if (!IsPostBack)
        {
                setUserInfo();
        }
    }
}

それが役に立てば幸い。

于 2015-11-15T03:52:16.720 に答える
0

上記のコードPage_Loadメソッドは次のように定義します。

 protected void Page_Load(object sender, EventArgs e)
    {
        if (Session["user"] != null && Session["user"].ToString() != "")
        {
            //do code here
        }
        else
        {
            Response.Redirect("/Account/Login.aspx?link=" + System.Web.HttpContext.Current.Request.Url.PathAndQuery);
        }
    }
于 2012-07-17T07:09:32.423 に答える