認証されたユーザーの名前、IPアドレス、およびHTTPフィルターから呼び出されているコントローラーアクションを取得するにはどうすればよいですか?

90abyss

コントローラでアクションイベントを監査しようとしています。認証されたユーザーの名前、そのIPアドレス、および呼び出されているコントローラーアクションを追跡したいと思います。

私のフィルターコード:

public class AuditAttribute : System.Web.Http.Filters.ActionFilterAttribute
    {
        public override void OnActionExecuting(HttpActionContext filterContext)
        {
            var request = filterContext.Request;
            // get user name + ip address + controlleraction 
            base.OnActionExecuting(filterContext);
        }

私はインターネットで検索して、HTTPではなくMvcでそれを行う方法の例を見ました。たとえば、次のリンクでは、Mvcのイベントを監査する方法について説明しています:http://rion.io/2013/03/03/implementing-audit-trails-using-asp-net-mvc-actionfilters/

ただし、このリンクでは、HTTP WebアプリのIPアドレスをキャプチャする方法について説明しています。WebAPI認証フィルターで要求IPアドレスをキャプチャするしかし、私はそれに従うのに苦労しています。このコードをどこに正確に配置するかわからない。

あなたの助けに感謝。

ヴィノド

以下のコードを使用してみてください。

更新: asp.net Web APIの場合は、これを試してください

public class AuditAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(HttpActionContext actionContext)
        {
            var context = actionContext.RequestContext;
            var user = context.Principal.Identity.IsAuthenticated ? context.Principal.Identity.Name : string.Empty;
            var ip = GetClientIpAddress(actionContext.Request);
            var action = actionContext.ActionDescriptor.ActionName;
            var controller = actionContext.ActionDescriptor.ControllerDescriptor.ControllerName;

            base.OnActionExecuting(actionContext);
        }

        private string GetClientIpAddress(HttpRequestMessage request)
        {
            if (request.Properties.ContainsKey("MS_HttpContext"))
            {
                return IPAddress.Parse(((HttpContextBase)request.Properties["MS_HttpContext"]).Request.UserHostAddress).ToString();
            }
            if (request.Properties.ContainsKey("MS_OwinContext"))
            {
                return IPAddress.Parse(((OwinContext)request.Properties["MS_OwinContext"]).Request.RemoteIpAddress).ToString();
            }
            return String.Empty;
        }

    }

そして、asp.net MVCの場合、これを試すことができます

public class AuditAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {

        // get user name + ip address + controlleraction 
        var controller = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;
        var action = filterContext.ActionDescriptor.ActionName;
        var ip = filterContext.HttpContext.Request.UserHostAddress;
        var dateTime = filterContext.HttpContext.Timestamp;
        var user = GetUserName(filterContext.HttpContext);
    }


    private string GetUserName(HttpContext httpContext)
    {
        var userName = string.Empty;
        var context = httpContext.Current;
        if (context != null && context.User != null && context.User.Identity.IsAuthenticated)
        {
            userName = context.User.Identity.Name;
        }
        else
        {
            var threadPincipal = Thread.CurrentPrincipal;
            if (threadPincipal != null && threadPincipal.Identity.IsAuthenticated)
            {
                userName = threadPincipal.Identity.Name;
            }
        }
        return userName;
    }
}

更新2:考慮しなければならない要素がたくさんあるため、クライアントIPアドレスの取得は常に注意が必要な作業です。クライアントはどのようにアプリケーションにアクセスしていますか?それらはプロキシサーバーを介して来ていますか?IPアドレスはスプーフィングされる可能性があるため、100%信頼できる方法はありません。Httpヘッダーを見ると、WebAPIとMVCの両方である程度の成功が得られます。ただし、クライアントIPが無効になる場合があることを常に考慮する必要があります。

ASP.NET MVCでクライアントのIPアドレスを取得するにはどうすればよいですか?

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ