1

私には2つの属性があります:

  1. SecuredOperationAttribute
  2. ExceptionPolicyAttribute

ユーザーがコントローラーのアクションにアクセスできない場合は、カスタムのNonAuthorizedExceptionをスローしますが、ExceptionPolicyAttributeでキャッチできません。

私のコード:

[LogMethod]
[ExceptionPolicy]
public ActionResult Edit(int id)
{
   // some works on here
}

[Serializable]
public class ExceptionPolicyAttribute : OnExceptionAspect
{
    private ILog logger;
    private string methodName;

    public override void CompileTimeInitialize(MethodBase method, AspectInfo aspectInfo)
    {
        this.methodName = method.DeclaringType.FullName + "." + method.Name;
    }

    public override void OnException(MethodExecutionArgs args)
    {
        Guid guid = Guid.NewGuid();

        var stringBuilder = new StringBuilder(1024);

        // Write the exit message.
        stringBuilder.Append(this.methodName);
        stringBuilder.Append('(');

        // Write the current instance object, unless the method
        // is static.
        object instance = args.Instance;
        if (instance != null)
        {
            stringBuilder.Append("this=");
            stringBuilder.Append(instance);
            if (args.Arguments.Count > 0)
               stringBuilder.Append("; ");
        }

        // Write the list of all arguments.
        for (int i = 0; i < args.Arguments.Count; i++)
        {
            if (i > 0)
                stringBuilder.Append(", ");
            stringBuilder.Append(args.Arguments.GetArgument(i) ?? "null");
        }

        // Write the exception message.
        stringBuilder.AppendFormat("): Exception ");
        stringBuilder.Append(args.Exception.GetType().Name);
        stringBuilder.Append(": ");
        stringBuilder.Append(args.Exception.Message);

        logger.Error(stringBuilder.ToString(), args.Exception);

        args.FlowBehavior = FlowBehavior.Continue;
    }

    public override Type GetExceptionType(System.Reflection.MethodBase targetMethod)
    {
        return typeof(NonAuthorizedException);
    }
}

そして、安全な属性は次のとおりです。

[Serializable]
public class SecuredOperationAttribute: OnMethodBoundaryAspect
{
    public override void OnEntry(MethodExecutionArgs args)
    {
        IUserManager userManager = new UserManager();
        int userId = userManager.GetUserIdFromCookie;
        AdminUser adminUser = GenericSessionHelper<AdminUser>.Get(userId.ToString(), State.Session);
        if(!User.CanAccess)
        {
            args.ReturnValue = null;
            throw new NonAuthorizedException(string.Format("{0} userId li kullanıcının {1} işlemini yapmak için yetkisi yoktur",userId,args.Method.Name));
        }
        return;
    }
}

何が問題になる可能性がありますか?ポストシャープを間違った方法で使用していますか?

4

1 に答える 1

1

私は解決策を見つけました:私は次のような属性を使用していました:

[SecuredOperation]
[ExceptionPolicy]
public ActionResult Edit(int id)

しかし、ExceptionPolicyは例外をキャッチできませんでした。そこで、ExceptionPolicyをControllerクラスの最上位に移動しました。

[ExceptionPolicy]
    public class UserController : BaseAuthorizedUserController

今それは動作します。

于 2013-02-25T16:16:21.820 に答える