こんにちは私はFluentSecurityを使用して、MVCアプリケーションのユーザー権限を認証および検証しています。基本設定では、ユーザーがアクセスを拒否したAction
場合、例外がスローされます。黄色の例外ページを表示する代わりに、別のページ(ログインページなど)にリダイレクトする方法を知りたいですか?
3 に答える
この質問には既に回答があることは知っていますが、この状況を処理するためにすべてのアクションに try catch を入れるのは好きではありません。
Fluent Security では、ポリシー違反のハンドラーを登録できます ( https://github.com/kristofferahl/FluentSecurity/wiki/Policy-violation-handlersを参照)。IPolicyViolationHandler から継承するクラスが必要です。慣例は、クラスに名前を付けることです<PolicyViolationName>PolicyViolationHandler
以下は、DenyAnonymousAccessPolicyViolationHandler を登録するハンドラーの例です。
/// <summary>
/// Custom Policy Violation Handler. See http://www.fluentsecurity.net/wiki/Policy-violation-handlers
/// </summary>
public class DenyAnonymousAccessPolicyViolationHandler : IPolicyViolationHandler
{
public ActionResult Handle(PolicyViolationException exception)
{
Flash.Error("You must first login to access that page");
return new RedirectResult("/");
}
}
遭遇するもう 1 つの警告は、IOC コンテナーを使用してこれらのハンドラーを登録する必要があることです。IOC コンテナーを使用することが良いか悪いかについては議論しませんが、持っていない場合は on を使用しないことを好みます。彼らの Web サイトには、IOC コンテナーを使用せずにこれを行う方法について書かれたブログがありましたが、私はそのアプローチもあまり好きではありませんでした。これが私がしたことです。
public static class SecurityConfig
{
public static void Configure()
{
SecurityConfigurator.Configure(c =>
{
c.GetAuthenticationStatusFrom(() => HttpContext.Current.User.Identity.IsAuthenticated);
c.GetRolesFrom(() => (HttpContext.Current.Session["Roles"] as string[]));
// Blanked Deny All
c.ForAllControllers().DenyAnonymousAccess();
// Publicly Accessible Areas
c.For<LoginController>().Ignore();
// This is the part for finding all of the classes that inherit
// from IPolicyViolationHandler so you don't have to use an IOC
// Container.
c.ResolveServicesUsing(type =>
{
if (type == typeof (IPolicyViolationHandler))
{
var types = Assembly
.GetAssembly(typeof(MvcApplication))
.GetTypes()
.Where(x => typeof(IPolicyViolationHandler).IsAssignableFrom(x)).ToList();
var handlers = types.Select(t => Activator.CreateInstance(t) as IPolicyViolationHandler).ToList();
return handlers;
}
return Enumerable.Empty<object>();
});
});
}
}
現在、FluentSecurity安定バージョン(1.4)には、処理するための組み込み機能がありませんPolicyViolationException
が、次のように、それを行うためのフィルターを作成できます。
public class PolicyViolationExceptionHandler : IExceptionFilter
{
public void OnException(ExceptionContext filterContext)
{
if (filterContext.Exception.GetType() == typeof(PolicyViolationException))
{
var routeDictionary = new RouteValueDictionary(new
{
area = "",
controller = "account",
action = "login"
});
// Redirect to specific page
filterContext.HttpContext.Response.RedirectToRoute(routeDictionary);
// Prevent to handle exceptions
// Of 'PolicyViolationException' by default filters
filterContext.ExceptionHandled = true;
}
}
}
私は決して使用FluentSecurity
しませんが、この方法に従ってアクションをリダイレクトできます。例えば;
public ActionResult YourActionName()
{
try
{
}
catch ( Exception )
{
return RedirectToAction("Index", "Home");
}
}
また、コントローラー クラスで属性を使用して未処理の例外をキャッチすることもでき、Shared フォルダーHandleError
のビューが自動的に返されます。Error.aspx
また、カスタマイズすることもできます。
詳細については、ScottGu の投稿を確認してください。 http://weblogs.asp.net/scottgu/archive/2008/07/14/asp-net-mvc-preview-4-release-part-1.aspx