現在、Windows認証を使用してイントラネットサイトを作成しています。
これは最善の方法ではないかもしれませんが、承認された個人だけがページのその部分を表示できるように、承認アクションフィルターがラップされたコントローラーメソッドを呼び出して部分ビューを読み込もうとしています。 。たとえば、ログインした個人が管理者である場合にのみ、管理者ツールをページにロードしたいとします。
したがって、index.cshtmlページには、次のようなものがあります。
@Html.Action("LoadAdminTools","ControllerName")
コントローラには次のコードが含まれます。
[Authorize(Roles="Admins")]
public ActionResult LoadAdminTools()
{
return PartialView("_AdminToolsPartialView");
}
そして、管理者コントロール(またはその他)を含む部分ビューは、ログインしたユーザーが管理者の役割の一部である場合にのみ、ページにレンダリングされます。
私が抱えている「問題」は、ログインしている人が部分ビューをロードする権限を持っていない場合、ブラウザがログインダイアログをポップアップしてユーザーの資格情報を要求することです。クレデンシャルを入力せずにダイアログを閉じると、期待どおりの結果が得られます。ページの残りの部分は読み込まれますが、部分的なビューは読み込まれません。かっこいいですが、迷惑です。間違ったクレデンシャルを入力すると、401エラーが発生します-これも予想どおりです。
役立つ場合:IISでは、匿名認証が無効になり、Windows認証が有効になります。[現在のユーザー名とパスワードでの自動ログオン]は、[セキュリティ設定-ローカルイントラネットゾーン]の[インターネットオプション]で選択されています。
私の質問はこれです:[承認]アクションフィルターを使用して、ブラウザーがユーザーにログインを要求することなく、部分的なビューをロードする(または実際に何かを行う)方法はありますか?現在ログインしているクレデンシャルを取得し、アクションフィルターに準拠しているかどうかを確認し、準拠している場合は部分ビューをロードし、準拠していない場合はロードしないでください。ない場合は、ここで達成したいことを実行するためのより良い方法はありますか?
アップデート
美しい。あなたが投稿した質問の解決策を読みました。MystereManは、コントローラーのフォルダー内にIntranetAuthorizeAttribute.csという新しいクラスを作成し、コードをスローしました。
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class IntranetAuthorizeAttribute : System.Web.Mvc.AuthorizeAttribute
{
protected override void HandleUnauthorizedRequest(System.Web.Mvc.AuthorizationContext filterContext)
{
if (filterContext.HttpContext.Request.IsAuthenticated)
{
filterContext.Result = new System.Web.Mvc.HttpStatusCodeResult(403);
}
else
{
base.HandleUnauthorizedRequest(filterContext);
}
}
}
Authorizeフィルターを新しいIntranetAuthorizeフィルターに置き換えました。
[IntranetAuthorize(Roles="Admins")]
public ActionResult LoadAdminTools()
{
return PartialView("_AdminToolsPartialView");
}
そして今、それはブラウザのログインダイアログなしでページをうまくロードします-それが許可されたユーザーであるときは部分的なビューで、そしてそれが許可されたユーザーでないときは部分的なビューなしで=)
ありがとうございました!