2012-01-04 16 views
2

私は大規模なWebサイトをより小さくより特定のサイトに分割するプロジェクトに取り組んでいます。私はこれらのサイトへのアクセスを、必要な権限を持つユーザーだけに制限する必要があり、可能な限り既存のメンバーシップ/ロールのデータモデルを利用したいと考えています。ASP.NETメンバーシップ/ロール - 複数のアプリケーション/ロールにユーザーをリンクする方法は?

理想的には、複数のアプリケーション(aspnet_applicationsテーブルで定義されている)とアプリケーション固有のロール(aspnet_roles)を単一のユーザーに割り当てることが理想的です。しかし、aspnetメンバーシップモデルでは、aspnet_usersレコードとaspnet_membershipレコードが特定のapplicationIDを保持しているため、これを許可していないようです。

単一のユーザーを複数のアプリケーション/ロールに割り当てることはどのように可能ですか?

答えて

2

標準のSqlMembershipプロバイダに加えて、おそらく1つのアプリケーションにデータをリンクさせたくない場合は、カスタムmanagement/roleプロバイダを使用することを検討することができます。

あなたがメンバー/ロールの情報を格納し、複数のアプリケーション間で、それらのテーブルを使用するようにデータベースに独自のテーブルを使用することができ、同様にそれはあなたがさらに進むことができ

など、データソースの使用方法のはるかに大きい柔軟性を有しますたとえば、カスタムメンバーシップとロールプロバイダを実装して別のモジュール(アセンブリ)を作成し、そのモジュールを複数のアプリケーションにわたって再利用することができます。

+0

私が理解する限り、SQLメンバーシップ・プロバイダは複数のアプリケーションを使用できます。実際には、「aspnet_applications」という表があり、残りのスキーマがリンクされているアプリケーションのID、名前、および説明が格納されています。 – aleafonso

+1

@aleafonso - 確かに、あなたが正しいです、私はちょうどあなたの答えの別の選択肢を提供することによっていくつかの光を陰にしたい。あなたの答えに+1。 – TheBoyan

+0

@BojanSkrchevski - ありがとう、カスタムプロバイダが私たちが必要とするかもしれない、あなたのブログの記事を介して読んで、非常に便利だったかもしれません。 –

2

私はmy sqlメンバーシップ・プロバイダを使用しましたが、設計上、SQLプロバイダとはそれほど異なっているとは思われません。

同じユーザーを異なるロールに関連付けるには、asp_net_usersinrolesと呼ばれるテーブルが必要です。このテーブルでは、異なるroleIDを持つ同じuserIDを挿入することができるため、ユーザーは複数のロールを持つことができます。

同様に、管理ユーザーが異なる役割を割り当てることができるようにするには、UIを作成する必要があります。私の場合、ListBoxを使用してアプリケーションの既存のロールを表示し、複数の選択が可能です。

これが役に立ちます。

+0

私たちは確かにaspnet_usersinrolesテーブルを利用しています。 –

0

メンバーシップがコードで照合するApplicationNameを設定できます。

私は、一連の他のアプリケーションのすべてを管理する管理アプリケーションを持っています。私はそのアプリケーションのユーザーが他のすべてのアプリケーションにログインできるようにしたいので、デフォルトのアプリケーションでログインが失敗した場合は、「管理」アプリケーションを確認します。これは、私がログイン用に持っているものです。 "Membership.ApplicationName =" Administration ";"という行に注意してください。

if (Membership.ValidateUser(model.UserName, model.Password)) 
{ 
    FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe); 
    if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/") 
     && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\")) 
    { 
     return Redirect(returnUrl); 
    } 
    else 
    { 
     return RedirectToAction("Index", "Home"); 
    } 
} 
else 
{ 
    Membership.ApplicationName = "Administration"; 
    if (Membership.ValidateUser(model.UserName, model.Password)) 
    { 
     FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe); 
     if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && retu rnUrl.StartsWith("/") 
      && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\")) 
     { 
      return Redirect(returnUrl); 
     } 
     else 
     { 
      return RedirectToAction("Index", "Home"); 
     } 
    } 
    else 
    { 
     ModelState.AddModelError("", "The user name or password provided is incorrect."); 
    } 
} 
関連する問題