【问题标题】:Password Protect MVC 4 Application - For Betatesters密码保护 MVC 4 应用程序 - 适用于 Betatesters
【发布时间】:2012-11-25 22:25:55
【问题描述】:

您有哪些方法可以让客户在上线之前测试 mvc 网站/应用程序?

我有一个 asp.net mvc 4 Web 应用程序。 beta.mydomain.com 和 public.mydomain.com - 在测试版中,只有拥有用户/密码的人才能访问。但是表单身份验证应该仍然有效。

  • 最好的解决方案是能够将相同的代码部署到 beta 版和公开版。手段,例如不添加仅允许“管理员”用户访问的授权属性。

我目前最好的解决方案是:

  • 在网站/应用程序的 IIS (7) 中,我只激活了标准身份验证
  • 将 web.config 更改为 Have authentication mode="windows"
  • 创建一个 Windows 用户并授予他对应用程序(目录)的访问权限

->> 问题是用户实际上已登录(意味着 User.IsAuthenticated 返回 true) - 但应用程序内部使用表单身份验证。两者可以结合吗?

我发现了一些类似的问题,但没有真正的解决方案:

https://serverfault.com/questions/175643/how-do-i-secure-a-net-mvc-website-prior-to-launch

Password protect a directory in IIS 7 (.Net MVC 2)

IIS Password prompt for given folder ASP.NET MVC

Password protect ASP.NET web application in IIS 7.5

我已经阅读了很多关于此主题的内容,无法相信这是不可能的。在为客户部署 alpha/beta 以在其上线之前对其进行测试时,您的方法是什么?

【问题讨论】:

    标签: asp.net-mvc iis-7 web-deployment


    【解决方案1】:

    如果您只是想确保有限的受众(例如测试用户)可以访问您的网站,最简单的方法是在现有的基础上添加 BasicDigest 身份验证身份验证。

    如果您的部署场景(生产与登台等)需要保护,请将其实现为 ActionFilterAttribute 并将其添加到您的全局过滤器集合中:

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        bool basicAuthenticationEnabled = true; // AppSettings etc.
    
        if (basicAuthenticationEnabled)
            filters.Add(new BasicAuthenticationAttribute());
    
        filters.Add(new HandleErrorAttribute())
    }
    

    对应的BasicAuthenticationAttribute 类的实现可能如下所示:

    public class BasicAuthenticationAttribute : ActionFilterAttribute
    {
        private const string Realm = "MyRealm";
        private const string UserName = "MyUserName";
        private const string Password = "MyPassword";
    
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            var authorizationHeader = filterContext.RequestContext.HttpContext.Request.Headers["Authorization"];
    
            if (authorizationHeader != null && authorizationHeader.StartsWith("Basic"))
            {
                var credentials = Encoding.ASCII.GetString(
                    Convert.FromBase64String(authorizationHeader.Substring(6))
                    ).Split(':');
    
                if (credentials[0].Equals(UserName) && credentials[1].Equals(Password))
                {
                    base.OnActionExecuting(filterContext);
                    return;
                }
            }
    
            // send require authentication
            var response = filterContext.HttpContext.Response;
            response .StatusCode = 401;
            response .AddHeader("WWW-Authenticate", String.Format("Basic realm=\"{0}\"", Realm));
            response .End();
        }
    }
    

    无论如何,我强烈建议使用 Digest 身份验证,因为它在通过网络发送密码之前对密码应用哈希函数,这比基本访问身份验证安全 - 至少一点点 -发送明文。

    您可以在此处找到 DigestAuthorizationAttribute 类的实现和更多信息:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-01
      • 2016-01-04
      相关资源
      最近更新 更多