0

メンバーシップにユーザーがいて、1 人のユーザーに 1 つまたは複数のロールを割り当てることができます。たとえば、ページの特定の役割を確認したい:

Role1、Role2、Role3、Role4、Role5

Role2 と Role3 のアクセス権を持つユーザーは Page1.aspx にアクセスできます。また、Role2 が使用可能であるため、Role1 と Role2 のアクセス権を持つユーザーもアクセスできます。

メンバーシップを実装し、ユーザーの役割の文字列配列のリストを持っています

string[] roles = Roles.GetRolesForUser(User.Identity.Name);

複数の役割を確認するにはどうすればよいですか? Roles.IsUserInRole 関数を使用して、1 つずつチェックする必要がありますか?

利用した; Partner in Capital のため 0 カウントを返します。大文字と小文字を区別しないようにするにはどうすればよいですか? 以下は、配列に対して配列をチェックする正しい方法ですか?

string[] userroles = { "Partner", "testsetsr" };
 string[] requiredroles = { "contractor", "customer", "sims", "nonclientau", "partner" };
        var countInRoles = userroles.Intersect(requiredroles).Count();
4

1 に答える 1

0

独自の承認フィルター属性を実装する必要があります。これを行うには、「AuthorizationAttribute」を拡張するクラスを作成し、必要なロール チェックを指定できる OnAuthorization をオーバーライドします。

これを行う方法の小さな例は、Nimesh の .Net ブログにあります。

この例は、個人的な問題の解決策ではありませんが、何をする必要があるかについてのアイデアを提供するはずです。

編集: アプリケーションのロール プロバイダーについても同じことが言えます。それを拡張し、IsUserInRole をオーバーライドして (または、新しいメソッドを追加することをお勧めします)、Roles.IsUserInRole を希望どおりに動作させるために必要なチェックを提供します。

2 番目の質問: 2 つの配列があり、1 番目の配列のメンバーが 2 番目のメンバーである場合、大文字と小文字を区別せずに数えたい場合は、linq を使用してそれを行うことができます。

var countInRoles = userroles.Select(u => u.ToLower()).Count(u => requiredroles.Select(r => r.ToLower()).Contains(u));

一方、何らかのアクションにアクセスするために必要なロールのリストがある場合は、リストを逆にして、linq を使用してユーザーが必要なすべてのロールを持っているかどうかを確認することもできます (ここでも大文字と小文字を区別しません)。

string[] requiredroles = { "Partner", "testsetsr" };
string[] userroles = { "contractor", "testsetsr", "customer", "sims", "nonclientau", "partner" };
var userHasAllRequiredRoles = requiredroles.Select(r => r.ToLower()).All(r => userroles.Select(u => u.ToLower()).Contains(r));
于 2013-04-09T06:29:16.387 に答える