2011-08-21 17 views
13

これは単純なはずですが、私のグーグルではわかりません。ここに私が欲しいものがあります。私は、権限を与えたいカスタムのUsersテーブル(現時点ではロールはありません)を持っています。このために、すでに行っているカスタムメンバーシッププロバイダを実装する必要があります。私の質問は、カスタムIPrincipalをHttpContext.Current.Userに設定する方法を教えてください。それはどこで起こるはずですか?のは、私は次のセットアップを持っているとしましょう:ASP.NET MVCでフォーム認証を使用するカスタムIPrincipal

public class CustomMembershipProvider : MembershipProvider 
{ 
    private IUserRepository _repository; 

    public CustomMembershipProvider(IUserRepository repository) 
    { 
     _repository = repository; 
    } 

    public override bool ValidateUser(string username, string password) 
    { 
     //check user repository 
    } 

    //additional methods omitted for brevity 
} 

私はその後、実装IPrincipalIIdentity

public class CustomUser : IPrincipal 
    { 
     public CustomUser(string name, int userId, string additionalInfo) 
     { 
      Identity = new CustomIdentity(name, userId, additionalInfo); 
     } 

     public IIdentity Identity { get; private set; } 

     public bool IsInRole(string role) 
     { 
      return true; 
     } 
    } 

    public class CustomIdentity : IIdentity 
    { 
     public CustomIdentity(string name, int userId, string additionalInfo) 
     { 
      Name = name; 
      UserId = userId; 
      AdditionalInfo = additionalInfo; 
     } 

     public string Name { get; private set; } 

     public string AuthenticationType 
     { 
      get { return "CustomAuth"; } 
     } 

     public bool IsAuthenticated 
     { 
      get { return !String.IsNullOrEmpty(Name); } 
     } 

     public int UserId { get; private set; } 
     public string AdditionalInfo { get; private set; } 
    } 

カスタム・ユーザー・クラスを持っているので、私の質問はどこContext.Userを設定するための正しい場所があり、ありますこのカスタムユーザーのインスタンスに?カスタム認可属性が必要ですか?もしそうなら、どのように見えますか?

+0

これでどのように最後に取り組みましたか?私はこれに似た何かをやっている初期の段階です。 – ETFairfax

+0

私は同じボートに乗っています、私は仕事をするための拡張メソッドを作成する準備がほぼ整っています! –

答えて

2

私は私がやっているので、私はメンバーシッププロバイダーを起動する方法を全くわからない

protected override void OnAuthorization(System.Web.Mvc.AuthorizationContext filterContext) 
{ 
    // Actual Authentication 
    HttpContext.User = user; 
    Thread.CurrentPrincipal = user; 
    base.OnAuthorization(filterContext); 
} 
を呼び出し、 OnAuthorizationに、そして、すべてのコントローラの

をカスタムコントローラの基本クラスを使用することをお勧めそれはmanualltですが、実際のオブジェクト構築を実行するにはMembership.Providerへの静的アクセスがあると思います。

カスタム認可属性が必要ですか?

号は、認証と承認の違いに注目してください:認証は、システムのユーザのアイデンティティを確立します。認可は、特定の要求を許可または拒否します。したがって、AuthorizeAttributeには、特定のユーザーだけがアクションを呼び出せるようにするためのRolesパラメータもあります。

+0

あなたの答えがわかりません。あなたは実際の認証を言うとき、AuthCookieを実際に設定しているのですか?それでは、Loingフォーム自体はポストで何をしますか? – BFree

+0

MembershipProviderを理解する方法として、ValidateUserは非常に頻繁に呼び出されるべきではありません。ユーザーがログインするとすぐに、彼は以後使用される認証Cookieを受け取ります。ただし、ユーザーオブジェクトを取得するには、データベース(またはいくつかのキャッシュ)にヒットする必要があります。しかし、それはあなたのコードの要件です。私はMembershipProviderは非常にうまく設計されていないと思う、それを手動で行うことは多くの利点があります。 – mnemosyn

+0

私は私が書いている間にあなたのコメントを変更しました:ユーザーが既に(フォーム)認証されていても、すべてのリクエストに対して 'OnAuthorization'が呼び出されます。ユーザーオブジェクトを取得するためだけにDBにヒットします。 – mnemosyn

関連する問題