0

ログインページを作成して、管理者としてログイン資格情報を入力する際に​​アクセス権を取得します。管理者でない場合は、ログインページにリダイレクトされます。私のデータベースでは、ブール型のフィールドを持っています:ユーザーの役割と権限

isAdmin <--datatype(byte") 

これを行うにはどうすればよいですか?私はリポジトリパターンの方法でこれをやりたいのですが、単体テストの方が簡単です。

私はこれをたくさん見つけて、問題について少し混乱し始めました。どのくらいのクラスやモデルなどが必要ですか?私は1つのコントローラーがやると思います。誰もが良いアイデアを持っていますか?私は、ユーザーの役割についてのDCIパターンを読んだことがありますが、それは基本的にはデータベース内のブール値をチェックするのが「唯一」なのかもしれません。すべてのフィードバックに感謝します。

答えて

2

を開始するには良い場所です。あなたの質問から、あなたが(少なくとも現状のままで)デフォルトメンバーシッププロバイダを使用していないようです。私はどちらもしなかった。だから、私がしたのは新しい認可属性を作成することでした。リポジトリメソッドIsAdminが供給されるユーザのIDに対応するブール値をチェックするために、クエリのような単純なものでした

public class AdminOnlyAttribute : AuthorizeAttribute { 
    IUserRepository _UserRepository; 

    public SimpleUser SimpleUser { get; set; } 

    public AdminOnlyAttribute() { 
     _UserRepository = new SqlUserRepository(new DbContext()); 
    } 

    protected override bool AuthorizeCore(HttpContextBase httpContext) { 
     bool baseAuthorized = base.AuthorizeCore(httpContext); 
     if (!baseAuthorized) { 
      return false; 
     } 

     //Here you use your repository to check if a user is an admin or not 
     bool isAdmin = _UserRepository.IsAdmin(int.Parse(httpContext.User.Identity.Name)); 

     if (!isAdmin) { 
      return false; 
     } 

     return true; 
    } 
} 

:あなたのケースでは、このようなものを見ることができます。この(SingleOrDefault()が必要であるかどう再確認してください)のようなもの:

public bool IsAdmin(int userID) { 
    bool isAdmin = (from user in db.Users 
        where user.ID == userID 
        select user.isAdmin).SingleOrDefault(); 
    return isAdmin; 
} 

そして、あなたがそうのようにしたいのアクションでこれを使用します。これはfalseを返した場合、あなたのActionResultはなり

[AdminOnly] 
public ActionResult Index(){ 
    //Code here... 
} 

理論的にはログインページにリダイレクトする必要があるHttpUnauthorizedResultです。

+0

フィードバックに感謝します。私はリポジトリメソッドIsAdminがどのように見えるべきかについてはっきりしていませんが、また、私はメソッドが戻り値の型を持っている必要があります:public AuthorizeAttribute() – Tim

+0

@Tim私がコンストラクタで間違いをしたためにあなたが得ているエラーがあります。それはAuthorizeRAttributeと呼ばれ、クラスはAdminOnlyAttributeと呼ばれる参照してください。それをAdminOnlyAttributeに変更してください。その方法については、私の答えを更新するつもりです。 –

+0

ありがとうございます。では、ActionResultでは、ユーザーがadminの場合は条件付きですべきですか? – Tim

0

isAdmin列はビットかバイトですか?それはおそらく少しべきである。資格情報とIsAdmin列を確認するクエリを作成するだけで済みます。行が返された場合、ログインは成功しました。

+0

はい、私はu.UserNameは "admin" を== db.Users 中のuから { するvar userResultsの=(ModelState.IsValid)場合は、このような何かを意味するので、それは少し:) – Tim

+0

OKであることを意味 && u.Password == "password" select u; } – Tim

+0

いいえ、あなたがユーザー名とパスワードを渡すことができる以外は、Kensaiが上記のIsAdminリポジトリメソッドで書いたようなものです。 (ユーザ名、文字列のパスワード){戻り値(db.Usersのユーザからuser.username ==ユーザ名&& user.password ==パスワード&& user.IsAdmin == trueのユーザを選択します).SingleOrDefault(); } ' – bmosh

1

カスタムメンバーシッププロバイダを作成し、ユーザーisAdminをValidateUserの一部としてチェックする必要があります。

他のユーザーが許可されている場合は、カスタムロールプロバイダーを使用してください。

次のリンクは、私が正しく理解していれば、私は同様の問題があった

http://theintegrity.co.uk/2010/11/asp-net-mvc-2-custom-membership-provider-tutorial-part-1/

関連する問題