密码保护MVC 4应用程序 - 对于Betatesters

时间:2012-12-07 17:38:52

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

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

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

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

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

  • 在网站/应用程序的IIS(7)中,我只激活了标准身份验证
  • 将web.config更改为具有身份验证模式=“windows”
  • 创建Windows用户并授予他访问应用程序(目录)的权限

- >> 问题是用户实际上已登录(表示User.IsAuthenticated返回true) - 但App内部使用表单身份验证。两者都可以合并吗?

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

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进行测试之前,您的方法是什么?

1 个答案:

答案 0 :(得分:3)

如果您只是想确保您的网站可供有限的受众群体访问(例如测试用户),最简单的方法是添加 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();
    }
}

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

您可以在此处找到DigestAuthorizationAttribute课程的实施和更多信息: