4

私はMVC 3アプリを持っています。主にセキュリティに関する2つのゾーンがあります。最初の1つは、大部分がパブリックアクセスを防止することですが、本当に機密情報ではありません。パスワードの強さは弱いかもしれません。ロールに基づいて一部のユーザーに強力なパスワードを要求する

第2ゾーン(エリア)が制限されています。ユーザーはアクセスを申請する必要があります。ユーザーがアクセス権を取得すると、特定の役割が得られます。したがって、各コントローラメソッドはそのロールに基づいてユーザーを自動化します。

次のログオン時に強力なパスワードに変更して、制限されたコンテンツにアクセスしてからアクセスできるようにします。

例:

ユーザAは、アクセスのために適用されます。 アクセスが許可されます。 のパスワードポリシーは、アクセス権がある間変更されます。彼らは次のログオン時に のパスワードを変更しなければならず、 はその役割を持っている限り弱いパスワードに戻すことができません。

ASP.NETを使用してこれを実装する安全な方法はありますか?

更新

私は実際にクリスが解決策を提案し、それが動作しますが、私は実際にはあまりにもミカの提案したソリューションからいくつかのインスピレーションを得た、パスワード自体の検証を処理するために使用しました。しかし、MembershipProvider.OnValidatingPasswordをオーバーライドすることは、実際にこれを解決する必要のない10以上の抽象メソッドを実装する必要があることを意味します。

私の目の中で、より良い解決策は、Membership.PhidwordPassword EVENTへのフックです。私はこの宿をApp_Startして、イベントハンドラで自分のパスワード検証を実装し、それが私の問題を解決しました。

ただ、これはあまりにも他の誰かのために私の問題とうまくいけばを解決しtoghetherクリス・ソリューションで、私はここにそれを提示あなたと解決策を共有する:

void App_Start() 
    { 
     //To do custom validation on certain passwords set new event handler 
     Membership.ValidatingPassword += Membership_ValidatingPassword; 
    } 

private void Membership_ValidatingPassword(object sender, ValidatePasswordEventArgs e) 
    { 
     //If the user is a new user, we let registration happen without strong password 
     if (e.IsNewUser) return; 


     MembershipUser membershipUser = Membership.GetUser(e.UserName); 
     Guid userId = Guid.Parse(membershipUser.ProviderUserKey.ToString()); 

     //First check if the pwd is strong enough to be flagged, if so we flag it 
     //using regex to validate the password (20 char, 2 uppercase so on) 
     if (MyValidationClass.IsStrongPassword(e.Password, 20, 2, 4, 1)) 
     { 
      //if the user does not already have a flag we set one 
      MyValidationClass.SetStrongPasswordFlag(userId); 
     } 
     else 
     { 
      //If the user needs strong pwd, we cancel the operation and throw exception 
      if (MyValidationClass.NeedsStrongPassword(e.UserName)) 
      { 
       e.FailureInformation = 
        new MembershipPasswordException("Password does not satisfy reqirements!"); 
       e.Cancel = true; 
      } 
      else 
      { 
       MyValidationClass.RemoveStrongPasswordFlag(userId); 
      } 
     } 
    } 
+0

[メンバーシップとロール](http://www.asp.net/web-forms/videos/how-do-i/how-do-i-secure-my-site)に関する何かを読んだり検索したりしたことがありますか? -using-membership-and-roles)を.NETで使用しますか? – balexandre

+0

ロールを設定する前に強力なパスワードを要求する方法はありますか?今度はパスワードを変更することで、プログラマチックに行うことができます。 – Aristos

+0

@belexandreはい、私はそれについてかなり読んだことがありますが、私はこれに関する情報は見ていません。私は上記の質問を検索しましたが、ロールベースの認証以外の情報は見つかりませんでした。それは私の疑問ではありませんが、あなたが機密扱いとみなすものに対しては本当に強力なパスワード要求があるかもしれないが、他のコンテンツに対しては通常強くて弱いということです。私はすべてのビデオを見ていない。上のビデオリンクにこれに関する情報がありますか? – cfs

答えて

2

を上書き必要があります。両方に対応するための属性。あなたは、単に、あなたのアプリケーションの関連セクションにそれを使用する必要があります。

例えば:

public class HasChangedPasswordAttribute : AuthorizeAttribute 
{  
    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     UserRepository repo = new UserRepository(); 
     var user = repo.GetCurrentUser(); 
     bool hasSecurelyChangedPassword = user.HasSecurelyChangedPassword; 
     return hasSecurelyChangedPassword; 
    } 

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     filterContext.Result = new RedirectResult("/Account/ChangePassword"); 
    } 
} 

上記のユーザーが安全にパスワードを変更されたことを確認します。そうでない場合は、パスワードを変更する新しいページにリダイレクトされます。変更したら、フラグを変更したものに設定します。あなたはこのようにそれを使用することができます

[HasChangedPassword] 
[Authorize(Roles="SuperRole")] 
public ActionResult MySecureAction() 
{ 
... 
} 

あなたは明らか一つにこれらの属性の両方を統合することもできますが、一例を示すのために、彼らは、上記区切られています。

+0

うーん、これは私をつかまえました何かに私はすでに基本的な承認のためにサイト全体に対してグローバルフィルタを持っています。ユーザーの役割を確認するためのロジックを追加すると、それは特定のルールが適用される特別な役割を果たします - 上記と同じです。パスワードの強さをチェックするためのASP.NETメンバーシップの機能はありますか?プレーンテキストでは格納されないので、実際にユーザーのパスワードを取得するのは簡単ではありません。 – cfs

+0

残念ながら、それを一度取得する方法はありませんが、パスワードを変更するようにユーザーを強制すると(上記のように)、投稿時点で確認できます。また、ユーザーが安全に設定している場合は、DBにフラグを格納します。 – Chris

+0

ありがとう、おそらく実行可能な方法です。セキュリティの意味を考えようとしています。私が考えることができるのは、暗号化されていないフラグをデータベースに保存することが懸念されることです。一方、誰もそのフラグを変更することはできません。 – cfs

-1

をおそらく簡単な方法は、パスワードの強度を確認だろうユーザーが新しいパスワードを入力しようとしているときにクライアント側に表示されます。いくつかの例については、listをJQueryを使って調べてください。

パスワードのアップグレードとリセットの処理に関して、これはコードで処理できるものです。つまり、ユーザーテーブルのフラグで、ユーザーを新しい登録ページにリダイレクトします。彼らは、パスワードを設定し(そしておそらくそれが適切な強さと一致した)ときしかし、それは、その後...提出することができる

+1

セキュリティ上の理由から、パスワードの複雑さをサーバ側で検証する必要があります –

+0

jQueryの使用は簡単に回避されます。何らかの方法でサーバー側で実行する必要があります。jQueryが要件を満たしているかどうかを確認するのに役立ちます。 – cfs

1

あなたがあなた自身の承認書くことができますがMembershipProvider.OnValidatingPassword

http://msdn.microsoft.com/en-us/library/system.web.security.membershipprovider.onvalidatingpassword.aspx

+0

新しいプロバイダを作成するにはソースコードが必要ですか、OnValidatePasswordをオーバーライドするだけで十分ですか? – cfs

+0

MembershipProviderから継承し、OnValidatingPasswordをオーバーライドする必要があります。私はあなたが与えられたものを使用しなければならないと思っていた。それ以上のことを見てください –

+1

私はこれを調べなければならないでしょうが、メソッドをオーバーライドする将来のメンテナンスのために、おそらくカスタムプロバイダを構築するよりも優れています... – cfs

関連する問題