2

Fluent Security を使用して、DenyAnonymousAccess、DenyAuthenticationAccess、および RequireRole を使用して Web サイト アクセスを構成しました。

SecurityConfigurator.Configure(configuration =>
{
    configuration.ResolveServicesUsing(new FluentSecurityServiceLocator());
    configuration.GetAuthenticationStatusFrom(CurrentUser.IsAuthenticated);

    configuration.GetRolesFrom(CurrentUser.Roles);

    configuration.For<HomeController>().DenyAnonymousAccess();
    configuration.For<ReportsController>().RequireRole(UserRole.Administrator);
    configuration.For<AccountController>().DenyAuthenticatedAccess();

    configuration.For<AccountController>(x => x.ChangePassword()).DenyAnonymousAccess();
});

DenyAnonymousAccess の PolictyViolationException を処理し、ログオン ページにリダイレクトしました。

public ActionResult Handle(PolicyViolationException exception)
{
    return new RedirectToRouteResult(
       new RouteValueDictionary(new { action = "Login", controller = "Account" })
       );
}

しかし、RequireRole からの例外のキャッチが同じプロセスであるかどうかはわかりません。RequireRole に違反している場合はリダイレクトする必要があります。

また、ユーザーがログオンしていないときにロールに関連付けられたリンクをクリックすると、処理されないバージョンの denyanonymousaccess 例外が発生します。構成と実装で何が間違っていますか??

4

1 に答える 1

4

違反ハンドラ クラスの名前を正しく定義する必要があります。処理が必要な違反によって異なります。DenyAnonymousAccessPolicy の違反を処理する場合、違反ハンドラー クラスの名前はポリシー名で始まる必要があり、IPolicyViolationHandler を実装する必要があります。次のようなすべてのポリシー違反について、このルールに従う必要があります。

public class DenyAnonymousAccessPolicyViolationHandler : IPolicyViolationHandler
{
    public ActionResult Handle(PolicyViolationException exception)
    {

        //Log the violation, send mail etc. etc.
        var rvd = new RouteValueDictionary(new
        {
            area = "",
            controller = "Account",
            action = "LogOn",
            statusDescription = exception.Message
        });
        return new RedirectToRouteResult(rvd);

    }
}

RequireRolePolicy の場合、ハンドラーは次のようになります。

public class RequireRolePolicyViolationHandler : IPolicyViolationHandler
{
    public ActionResult Handle(PolicyViolationException exception)
    {

        //Log the violation, send mail etc. etc.
        var rvd = new RouteValueDictionary(new
        {
            area = "",
            controller = "Home",
            action = "Home",
            statusDescription = exception.Message
        });
        return new RedirectToRouteResult(rvd);

    }
}

流暢なセキュリティ ポリシー違反ハンドラーの詳細については、このリンクを確認してください。

https://github.com/kristofferahl/FluentSecurity/wiki/Policy-violation-handlers-2.0

それが役に立てば幸い!!!

于 2012-12-01T05:47:53.943 に答える