ユーザーは認証されたが、アクセスできないページにアクセスしようとすると(試験の役割のため)AuthError.aspxページ(「このページへのアクセス権がありません」)にリダイレクトされる必要があります。 web.configを次のように設定した場合:
<authentication mode="Forms">
<forms loginUrl="~/Account/Login.aspx" timeout="2880" />
</authentication>
ユーザーは既に認証されており、このページにリダイレクトする必要がないため、これはシステムの間違った動作です。しかし、ここでLogin.aspxの代わりにAuthError.aspxを書くと、まだ認証されていないユーザーをログインページにリダイレクトできますか?
ログインページの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");
}
}
}
私にとってこの問題に対する最も面倒な解決策は、Login.aspxページに、ログインフォームの代わりに「アクセスが拒否されました」と認証された(ログインした)ユーザーに表示されるコンテンツを含む別のセクション(パネル)を作成することでした。ログインしたユーザーがページにアクセスすると、ここでリダイレクトされたページにアクセスするための認証が行われないため、ここで終了する可能性が高いことを意味します。
ログインページでは、この非常に単純なコードを使用して、パネルとログインフォームの表示を切り替えます。
if (Request.IsAuthenticated)
{
LoginUser.Visible = false;
AccessDeniedPanel.Visible = true;
}
それは非常に簡単で、動作します。
必要がある:
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サイトの特定の領域へのアクセスを制限する必要があります。今日、私は実際にこれを達成する方法を説明する別の質問に答えました。 ここ はリンクです
認証と許可を区別する必要があります。コードスニペットは前者(「このサイトに知っているか」)には対応していますが、後者(「このページへのアクセスを許可していますか」)には対応していません。
@santiagoITが示唆するように、ロールは必要な承認を実装するための最良のソリューションかもしれません。 LoginViewなどの一部のコントロールはロール対応および認証対応であるため、これらを使用して、ユーザーのロールに応じて異なるコンテンツを表示できます。
一般的なアプローチは、さまざまなロールのユーザーにさまざまなメニューを表示することです。そのため、ユーザーはそれぞれのロールに関連するメニューのみが表示されます。これにはLoginViewがよく使用されます。
別の方法として、LoginViewを使用して個々のページのコンテンツの可視性を制御し、認証されていないユーザーが1つのメッセージ、認証されているがページの表示を許可されていないユーザー、ページの閲覧を許可されたコンテンツを参照してください。
認証されているがページを表示するために必要なアクセス権を持たないユーザーを単にリダイレクトしたい場合は、ユーザーが適切なロール(Roles.IsUserInRole)であることを確認し、「アクセス権がありません」にリダイレクトすることもできます..」ページがない場合。
本当にセキュリティを重視している場合は、制限されたメニュー/表示のアプローチと各ページの承認チェックを組み合わせることができます。
これを試して :
あなたが指定したページにアクセスするには管理者ユーザーのみが必要だと仮定し、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");
}
}