web-dev-qa-db-ja.com

承認されていないときにユーザーをASP.NETページにリダイレクトする方法

ユーザーは認証されたが、アクセスできないページにアクセスしようとすると(試験の役割のため)AuthError.aspxページ(「このページへのアクセス権がありません」)にリダイレクトされる必要があります。 web.configを次のように設定した場合:

<authentication mode="Forms">
  <forms loginUrl="~/Account/Login.aspx" timeout="2880" />
</authentication>

ユーザーは既に認証されており、このページにリダイレクトする必要がないため、これはシステムの間違った動作です。しかし、ここでLogin.aspxの代わりにAuthError.aspxを書くと、まだ認証されていないユーザーをログインページにリダイレクトできますか?

21
mimic

ログインページのPage_Loadで、ユーザーが認証されているかどうか、およびユーザーがアクセス拒否ページにリダイレクトするかどうかを確認する必要があります。

protected void Page_Load(object sender, EventArgs e)
{
    if (User.Identity.IsAuthenticated) // if the user is already logged in
    {
            Response.Redirect("~/AccessDenied.aspx");
    }
}

少し見栄えを良くしたい場合は、ReturnUrlパラメーターをチェックして、ユーザーがページに直接アクセスしたかどうか(ログインページに保存したブックマークなど)を判断し、別の方法で処理できます。次に例を示します。

protected void Page_Load(object sender, EventArgs e)
    {
        if (User.Identity.IsAuthenticated)
        {

            // if they came to the page directly, ReturnUrl will be null.
            if (String.IsNullOrEmpty(Request["ReturnUrl"]))
            {
                 /* in that case, instead of redirecting, I hide the login 
                    controls and instead display a message saying that are 
                    already logged in. */
            }
            else
            {
            Response.Redirect("~/AccessDenied.aspx");
            }
        }
    }
24
Joel Beckham

私にとってこの問題に対する最も面倒な解決策は、Login.aspxページに、ログインフォームの代わりに「アクセスが拒否されました」と認証された(ログインした)ユーザーに表示されるコンテンツを含む別のセクション(パネル)を作成することでした。ログインしたユーザーがページにアクセスすると、ここでリダイレクトされたページにアクセスするための認証が行われないため、ここで終了する可能性が高いことを意味します。

ログインページでは、この非常に単純なコードを使用して、パネルとログインフォームの表示を切り替えます。

if (Request.IsAuthenticated)
{
    LoginUser.Visible = false;
    AccessDeniedPanel.Visible = true;
}

それは非常に簡単で、動作します。

2
Filip

必要がある:

1)ロールを有効にします(web.configで):( 'xxx'を独自の値に置き換えます)

<roleManager enabled="true">
  <providers>
    <clear />
    <add connectionStringName="ApplicationServices" applicationName="xxx"
      name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" />
    <add applicationName="xxx" name="AspNetWindowsTokenRoleProvider"
      type="System.Web.Security.WindowsTokenRoleProvider" />
  </providers>
</roleManager>

2)特定の役割について、Webサイトの特定の領域へのアクセスを制限する必要があります。今日、私は実際にこれを達成する方法を説明する別の質問に答えました。 ここ はリンクです

1
santiagoIT

認証と許可を区別する必要があります。コードスニペットは前者(「このサイトに知っているか」)には対応していますが、後者(「このページへのアクセスを許可していますか」)には対応していません。

@santiagoITが示唆するように、ロールは必要な承認を実装するための最良のソリューションかもしれません。 LoginViewなどの一部のコントロールはロール対応および認証対応であるため、これらを使用して、ユーザーのロールに応じて異なるコンテンツを表示できます。

一般的なアプローチは、さまざまなロールのユーザーにさまざまなメニューを表示することです。そのため、ユーザーはそれぞれのロールに関連するメニューのみが表示されます。これにはLoginViewがよく使用されます。

別の方法として、LoginViewを使用して個々のページのコンテンツの可視性を制御し、認証されていないユーザーが1つのメッセージ、認証されているがページの表示を許可されていないユーザー、ページの閲覧を許可されたコンテンツを参照してください。

認証されているがページを表示するために必要なアクセス権を持たないユーザーを単にリダイレクトしたい場合は、ユーザーが適切なロール(Roles.IsUserInRole)であることを確認し、「アクセス権がありません」にリダイレクトすることもできます..」ページがない場合。

本当にセキュリティを重視している場合は、制限されたメニュー/表示のアプローチと各ページの承認チェックを組み合わせることができます。

1
SimonF

これを試して :

あなたが指定したページにアクセスするには管理者ユーザーのみが必要だと仮定し、page_loadで次のように書くことができます:

if (User.Identity.IsAuthenticated)
{
   if ( !User.IsInRole("Admin"))
   {
        Server.Transfer("~/AccessDeniedPage.aspx");
   }

}

そして、あなたができるルートを使用している場合:

if (User.Identity.IsAuthenticated)
{
   if ( !User.IsInRole("Admin"))
   {
        Response.RedirectToRoute("AccessDeniedRoute");
   }

}
0
Lucky