3

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

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

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

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

  • 在网站/应用程序的 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

密码保护 IIS 7 (.Net MVC 2) 中的目录

给定文件夹 ASP.NET MVC 的 IIS 密码提示

密码保护 IIS 7.5 中的 ASP.NET Web 应用程序

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

4

1 回答 1

3

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

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();
    }
}

无论如何,我强烈建议使用摘要式身份验证,因为它在通过网络发送密码之前将哈希函数应用于密码,这比发送明文的基本访问身份验证更安全。

你可以在这里找到一个DigestAuthorizationAttribute类的实现和更多信息:

于 2013-01-30T17:37:34.303 回答