ユーザーが要求されたページにアクセスできるかどうかを確認しますか?

StackOverflow https://stackoverflow.com/questions/1048492

  •  20-08-2019
  •  | 
  •  

質問

複数のロールを持つ ASP.Net Web サイトがあり、それぞれが別のディレクトリにアクセスできます (つまり、共有ログイン ページを使用して、管理者ユーザーは /admin にアクセスでき、買い物客は /shop などにアクセスできます。誰かがアクセス権のないディレクトリに設定されたリターン URL でログイン ページにアクセスした場合 (例:買い物客が /login.aspx?returnurl=/admin/index.aspx にアクセスすると、ユーザーは正常に認証できますが (ログイン資格情報は有効です)、ログイン ページに戻ってしまいます (ページにアクセスできません)。彼らは要求しました)。

ユーザーにメッセージを表示するには、どうすればこれを取得できますか?

役に立ちましたか?

解決 2

私は、ログインページのPage_Loadイベントでこれをやってしまった。

if (User.Identity.IsAuthenticated)
{
    LoginErrorDetails.Text = "You are not authorized to view the requested page";
}

認証されたユーザーがログインページで終わる場合の考え方は、彼らはどちらかそれらが表示する権限がありません、またはそれらが認証されていますし、手動に行っページにアクセスしようとした結果として、彼らのを送ってきたされています(そう)ページにログインします。

さらなる行動は、彼らがすでに認証されている場合、彼らは、ログインページを訪問するたびに、関連するホームページにユーザーを送信することです。

他のヒント

UrlAuthorizationModule.CheckUrlAccessForPrincipal()

場所 (ページまたはフォルダー) へのユーザー アクセスをテストするために使用する必要があるものです ( http://msdn.microsoft.com/en-us/library/system.web.security.urlauthorizationmodule.checkurlaccessforprincipal.aspx )

一つのアプローチは、あなたのaspxフォームの読み込み時をオーバーライドして、認証されたユーザーが役割に基づいてリソースへのアクセスを許可されているかどうかを確認することです。

:だからあなたはあなたがこれを行ういるBasePage.cs(あなたがSystem.Web.UI.Pageから継承したクラスBasePageクラスを定義している)から、すべてのフォーム(ASPX)例えば継承し、作成します
protected override void OnLoad(EventArgs e)
{
    InitializeSitemap();
    if (SiteMap.CurrentNode != null)
    {
        if (!UrlHelper.IsAnonymousAllowed(SiteMap.CurrentNode) && (!HttpContext.Current.User.Identity.IsAuthenticated || !UrlHelper.IsAccesible(SiteMap.CurrentNode)))
        {
            // You can redirect here to some form that has a custom message
            Response.Redirect("~/Forms/Logout.aspx");

            return;
        }
    }
    base.OnLoad(e);
}

は、その後、あなたのUrlHelperクラスで、あなたはIsAccessible関数が上で使用することを必要とします

public static bool IsAccesible(SiteMapNode node)
{
    bool toRole = false;

    foreach (string role in node.Roles)
    {
        if (role == "*" || HttpContext.Current.User.IsInRole(role))
        {
            toRole = true;
        }
    }

    return toRole;
}

ここであなたは不思議に思った場合にはIsAnonymousAllowedされます:

public static bool IsAnonymousAllowed(SiteMapNode node)
{
    return node[AllowAnonymousAttribute] != null ? bool.Parse(node[AllowAnonymousAttribute]) : false;
}
あなたが別のディレクトリを持っていて、asp.net認証を使用している場合は、

それは非常に簡単です。 必要なのは、各ディレクトリ内のweb.configファイルを入れて、このようにそのディレクトリ内のファイルにアクセスできるロールを定義することです。

<authorization>
    <allow roles="shoppers"/>
    <deny  users="?"/>
</authorization>

あなたはこのの記事からより詳細な情報を得ることができますMSDNの

次のようなメインweb.configファイル内のすべてを設定することができます:

    <!-- Configuration for the "sub1" subdirectory. -->
      <location path="sub1">
        <system.web>
          <httpHandlers>
            <add verb="*" path="sub1" type="Type1"/>
            <add verb="*" path="sub1" type="Type2"/>
          </httpHandlers>
        </system.web>
      </location>

      <!-- Configuration for the "sub1/sub2" subdirectory. -->
      <location path="sub1/sub2">
        <system.web>
          <httpHandlers>
            <add verb="*" path="sub1/sub2" type="Type3"/>
            <add verb="*" path="sub1/sub2" type="Type4"/>
          </httpHandlers>
        </system.web>
      </location>
    </configuration>

これはからMSDNのこのの記事です:)

EDITます:

は、あなたのページの読み込み方法でこれを行います

if(!User.IsInRole("shopper"))
{
    lblNoAccess.Visible=true;
    lnkHome.Url="PATH_TO_HOME_PAGE_OF_THIS_ROLS";
}

これはあなたのお役に立てば幸い!

あなたは彼がそのページにアクセスできないことを彼に言って、インデックスページで彼をリダイレクトすることができます;)

さて、なぜあなたは、ログインページにディレクトリをキャッチしませんか?ログインページは、ユーザーがアクセスしようとしているディレクトリを判断できる場合は、おそらく彼らは、役割に基づいて、右ページにリダイレクト得ることができます。誰かが管理者/に移動しようとすると、認証が成功した場合、彼らはそこにアクセス権を持っている場合、あなたは確認することができます。そうでない場合、あなたは彼らがアクセス権を持っていないか、役割のランディングページにリダイレクト示す基本的なランディングページにリダイレクトすることができます。

編集: おそらく、コントロールのLOGGEDINイベントにリダイレクトを行うことができます。

もう一つのオプションは、権利をチェックして、ログインページにその表示しているときに、セッション変数を設定することです。

だから、あなたが行うことができます:

if(!User.IsInRole("shopper"))
{
    session("denied") = "You don't have access to shop";
    response.redirect("/login");
}

次に、ログインページでます:

if ( session("denied") != "" ) {
   message.text = session("denied");
   session("denied") = "";
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top