繁体   English   中英

忽略ASP.NET Identity中静态文件的身份验证

[英]Ignore Authentication Validation for static files in ASP.NET Identity

我在应用程序中使用asp.net identity 2来实现Identity系统。 当我使用EF Profiler对应用程序进行配置时。

我看到每个静态文件请求中都将其连接到数据库的问题。 这对于性能和页面加载速度非常不利。 在此处输入图片说明

为了解决这个问题,我编写了以下代码:

Global.asax

    protected void Application_AuthenticateRequest(object sender, EventArgs e)
    {
        if (shouldIgnoreRequest())
            return;
        if (Context.User == null)
            return;
    }
    private bool shouldIgnoreRequest()
    {
        string[] reservedPath =
        {
            "/__browserLink",
            "/favicon.ico",
            "/img",
            "/css"
            ,"/w",
            "/js"
        };
        var rawUrl = Context.Request.RawUrl;
        if (reservedPath.Any(path => rawUrl.StartsWith(path, StringComparison.OrdinalIgnoreCase)))
        {
            return true;
        }
        return BundleTable.Bundles.Select(bundle => bundle.Path.TrimStart('~'))
            .Any(bundlePath => rawUrl.StartsWith(bundlePath, StringComparison.OrdinalIgnoreCase));
    }

RouteConfig.cs

  routes.IgnoreRoute("img/{*pathinfo}");
  routes.IgnoreRoute("js/{*pathinfo}");
  routes.IgnoreRoute("css/{*pathinfo}");
  routes.IgnoreRoute("{file}.gif");
  routes.IgnoreRoute("{file}.jpg");
  routes.IgnoreRoute("{file}.js");
  routes.IgnoreRoute("{file}.css");
  routes.IgnoreRoute("{file}.png");
  routes.IgnoreRoute("{file}.pdf");
  routes.IgnoreRoute("{file}.htm");
  routes.IgnoreRoute("{file}.html");
  routes.IgnoreRoute("{file}.swf");
  routes.IgnoreRoute("{file}.txt");
  routes.IgnoreRoute("{file}.xml");
  routes.IgnoreRoute("{*favicon}", new { favicon = @"(.*/)?favicon.ico(/.*)?" });

如何忽略此身份验证请求?

尝试自定义OnValidateIdentity以忽略不需要的请求:

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
   // ...
    Provider = new CookieAuthenticationProvider
    {
        OnValidateIdentity = context =>
        {
            if(shouldIgnoreRequest(context)) // How to ignore Authentication Validations for static files in ASP.NET Identity
            {
                return Task.FromResult(0);
            }
            return container.GetInstance<IApplicationUserManager>().OnValidateIdentity().Invoke(context);
        }
    },
    // ...
});

使用这种方法

private static bool shouldIgnoreRequest(CookieValidateIdentityContext context)
{
    string[] reservedPath =
    {
        "/__browserLink",
        "/img",
        "/fonts",
        "/Scripts",
        "/Content",
        "/Uploads",
        "/Images"
    };
    return reservedPath.Any(path => context.OwinContext.Request.Path.Value.StartsWith(path, StringComparison.OrdinalIgnoreCase)) ||
                       BundleTable.Bundles.Select(bundle => bundle.Path.TrimStart('~')).Any(bundlePath => context.OwinContext.Request.Path.Value.StartsWith(bundlePath,StringComparison.OrdinalIgnoreCase));
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM