コントローラでアクションイベントを監査しようとしています。認証されたユーザーの名前、その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が無効になる場合があることを常に考慮する必要があります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加