5

Elmah.Mvc 2.0 のカスタム認証を実装しようとしています。web.config に 2 つのキー (elmah.mvc.allowedRoles と elmah.mvc.allowedUsers) があることはわかっていますが、それだけでは十分ではありません。

Cookie にランダムなソルトを追加するカスタム フォーム認証メソッドを使用しているため、elmah.mvc.allowedUsers 値に設定する明確なユーザー名がありません。また、ロールは実装されていません。

ElmahController またはいくつかの Elmah 認証クラス/メソッドをオーバーライドする方法はありますか?

ありがとう!

4

3 に答える 3

4

それに関する進行中の議論はどこですか - https://github.com/alexanderbeletsky/elmah-mvc/pull/24

今のところ、それを直接行うことはできませんが、チケットでは、カスタム フィルターを含むいくつかの解決策を見ることができます。Elmah.MVCパッケージ自体で特別な tweeks を実行する必要があるかどうかについては、まだよくわかりません。

于 2013-08-23T11:26:46.143 に答える
3

まさにそれを行い、ElmahController をオーバーライドできます。実際、アレクサンダー・ベレツキーはすでに Elmah.Mvc という名前の nuget パッケージを提供します。

独自の ElmahController を作成したら、任意の承認を適用できます。私のアプリケーションには、それを適用するベース承認済みコントローラーがあります。ルートを構成して Elmah の結果を返すだけでよく、彼のサイトにすべて詳しく説明されています。

更新:これを見てからしばらく経ちましたが、上記に触発されたが実際には使用していない独自のコントローラーがあります。

[Authorize]
public class ElmahController : BaseAuthorizedController
{
    public ActionResult Index(string type)
    {
        return new ElmahResult(type);
    }
}

結果はこれです

using System;
using System.Web;
using System.Web.Mvc;

namespace Epic.Mvc.Mvc.ActionResults
{
    public class ElmahResult : ActionResult
    {
        private readonly string _resouceType;

        public ElmahResult(string resouceType)
        {
            _resouceType = resouceType;
        }

        public override void ExecuteResult(ControllerContext context)
        {
            var factory = new Elmah.ErrorLogPageFactory();

            if (!string.IsNullOrEmpty(_resouceType))
            {
                var pathInfo = "/" + _resouceType;
                context.HttpContext.RewritePath(FilePath(context), pathInfo, context.HttpContext.Request.QueryString.ToString());
            }

            var currentApplication = (HttpApplication)context.HttpContext.GetService(typeof(HttpApplication));
            if (currentApplication == null) return;
            var currentContext = currentApplication.Context;

            var httpHandler = factory.GetHandler(currentContext, null, null, null);
            if (httpHandler is IHttpAsyncHandler)
            {
                var asyncHttpHandler = (IHttpAsyncHandler)httpHandler;
                asyncHttpHandler.BeginProcessRequest(currentContext, r => { }, null);
            }
            else
            {
                httpHandler.ProcessRequest(currentContext);
            }
        }

        private string FilePath(ControllerContext context)
        {
            return _resouceType != "stylesheet" ? context.HttpContext.Request.Path.Replace(String.Format("/{0}", _resouceType), string.Empty) : context.HttpContext.Request.Path;
        }
    }
}

そして、私には2つのルートがあります(2番目は非常にオプションです)

routes.MapRoute("ElmahHandler", "elmah/{type}", new { action = "Index", controller = "Elmah", type = UrlParameter.Optional });
            routes.MapRoute("ElmahHandlerShortHand", "errors/{type}", new { action = "Index", controller = "Elmah", type = UrlParameter.Optional });
于 2013-08-20T12:46:21.077 に答える