ユーザーが要求されたページにアクセスできるかどうかを確認しますか?
-
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;
}
それは非常に簡単です。 必要なのは、各ディレクトリ内の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") = "";
}