3

クライアントがライブになる前にMVCWebサイト/アプリケーションをテストできるようにするためのアプローチは何ですか?

asp.net mvc4Webアプリケーションがあります。beta.mydomain.comとpublic.mydomain.com-ベータ版では、ユーザー/パスワードを持っている人だけがアクセスできます。ただし、フォーム認証は引き続き機能します。

  • 最善の解決策は、同じコードをベータ版とパブリックにデプロイできるようにすることです。たとえば、「管理者」ユーザーのみがアクセスできるようにする承認属性を追加しないことを意味します。

私の現在の最善の解決策は次のとおりです。

  • Webサイト/アプリケーションのIIS(7)で、標準認証のみをアクティブ化しました
  • web.configをHaveauthenticationmode="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)のディレクトリをパスワードで保護します

指定されたフォルダーのIISパスワードプロンプトASP.NETMVC

IIS7.5のASP.NETWebアプリケーションをパスワードで保護します

私はこのトピックについてたくさん読みましたが、これが不可能だとは信じられません。クライアントが稼働する前にテストするためにアルファ/ベータを展開するときのアプローチは何ですか?

4

1 に答える 1

3

限定されたユーザー (テスト ユーザーなど) が Web サイトにアクセスできるようにするだけの場合は、既存の認証に加えてBasicまたはDigest認証を追加するのが最も簡単です。

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 に答える