2013-10-21 49 views
7

ロール内のすべてのユーザーの一覧を取得する方法はありますか。 Roles.GetUsersInRoleで可能になる前に、新しいアイデンティティでこのようなものは見つかりませんでした。ASP.NET ID:ロール内のすべてのユーザーを取得する

+1

データストアが実際にあなたが受け入れているアイデンティティを支えているものは何でもへの繰り返しのリモートクエリを含むロールのメンバーを、発見する驚異的に高価になることが - でも、これらの店舗であれば* *そのようなクエリをサポートします。彼らの頭の上で物事を変えてみてください - なぜあなたは役割のすべてのメンバーを知る必要がありますか? (あなたのシステムにこの情報があるとすぐに期限切れになることを覚えておいてください) –

+1

@Damien_The_Unbeliever:古いメンバーシップから新しいアイデンティティにアプリケーションを移行する必要があります。たとえば、すべてのユーザーに電子メールを送信するには、管理者ロールのユーザーリストを作成する必要があります。今、私はそれについてのデータベースクエリを想像しようとしていて、内部結合が1つの単純なクエリのように見えます。たぶん私はたくさん迷っていますが、なぜこれが驚くほど高価なのか分かりません。ですから、私はいつもdbコンテキストを通してこれを行うことができますが、なぜフレームワークがこの機能を提供しないのか不思議です。 – graycrow

+0

私はそれが高価かもしれないと言った - アイデンティティシステムの使用のシナリオのすべてがSQLデータベースに格納された役割を持っているわけではありません。 –

答えて

5

1.0 RTMのRoleManagerでは不可能ですが、1.1ではIQueryable RoleManager.Rolesを介して公開されます。 1.0の場合、実装レイヤー(つまりDBコンテキスト)にドロップする必要があります

+5

コードを入力してください。 – daniel

+1

'context.Roles' – nandin

+0

あなたはそれを説明できますか?いくつかのコードや例を教えてください。ありがとう –

0

Entity Frameworkを使用できますが、Asp.Net Identity 1.0はまだ使用できません。アイデンティティ2.0のリリースを待たなければなりません。

using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings("DefaultConnection").ConnectionString)) { 
    string queryString = "SELECT AspNetUsers.UserName FROM dbo.AspNetUsers INNER JOIN dbo.AspNetUserRoles ON " + "AspNetUsers.Id=AspNetUserRoles.UserId WHERE AspNetUserRoles.RoleID='" + id + "'"; 
    SqlCommand command = new SqlCommand(queryString, connection); 
    command.Connection.Open(); 

    List<string> @out = null; 
    dynamic reader = command.ExecuteReader(); 
    while (reader.Read()) { 
     if (@out == null) @out = new List<string>(); 
     @out.Add(reader.GetString(0)); 
    } 

    return @out; 
} 
+0

IDを持つEntity Frameworkを使用する方が、SqlConnectionsとSqlCommandsにドロップする方が良いです。 IMO –

10

私は組み込みの方法は見ませんでしたが、実装するのはかなり簡単です。

public IQueryable<User> GetUsersInRole(string roleName) 
{ 
    return from user in Users 
      where user.Roles.Any(r => r.Role.Name == roleName) 
      select user; 
} 

SQLのそれの出力は、合理的なように見えた:

SELECT 
[Extent1].[Id] AS [Id], 
[Extent1].[Email] AS [Email], 
[Extent1].[EmailConfirmed] AS [EmailConfirmed], 
[Extent1].[PasswordHash] AS [PasswordHash], 
[Extent1].[SecurityStamp] AS [SecurityStamp], 
[Extent1].[PhoneNumber] AS [PhoneNumber], 
[Extent1].[PhoneNumberConfirmed] AS [PhoneNumberConfirmed], 
[Extent1].[TwoFactorEnabled] AS [TwoFactorEnabled], 
[Extent1].[LockoutEndDateUtc] AS [LockoutEndDateUtc], 
[Extent1].[LockoutEnabled] AS [LockoutEnabled], 
[Extent1].[AccessFailedCount] AS [AccessFailedCount], 
[Extent1].[UserName] AS [UserName] 
FROM [dbo].[AspNetUsers] AS [Extent1] 
WHERE EXISTS (SELECT 
    1 AS [C1] 
    FROM [dbo].[AspNetUserRoles] AS [Extent2] 
    INNER JOIN [dbo].[AspNetRoles] AS [Extent3] ON [Extent2].[RoleId] = [Extent3].[Id] 
    WHERE ([Extent1].[Id] = [Extent2].[UserId]) AND ([Extent3].[Name] = @p__linq__0) 
) 
0

これは新しいMVC 5 ASP.NET Identityのためである:

var managerRole = TMRoles.GetIdentityRole(TMRoles.Manager); 
var managers = managerRole.Users; 

public class TMRoles 
{ 
    private static RoleManager<IdentityRole> RoleManager = 
     new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(new TMContext())); 

    public static string Manager { get { return "Manager"; } } 


    public static IdentityRole GetIdentityRole(string roleName) 
    { 
     return RoleManager.FindByName(roleName); 
    } 
} 
4

何らかの理由で、非常に私は自分のアプリケーション固有のUserManagerでこのメソッドを持っています上記の@ChoptimusPrimeで提案された素晴らしいクエリは、ASP.NET Identity 2.2.1で私のためにコンパイルされませんでした。私は、拡張機能を書かれている:

public static IQueryable<User> GetUsersInRole(DbContext db, string roleName) 
{ 
    if (db != null && roleName != null) 
    { 
    var roles = db.Roles.Where(r => r.Name == roleName); 
    if (roles.Any()) 
    { 
     var roleId = roles.First().Id; 
     return from user in db.Users 
      where user.Roles.Any(r => r.RoleId == roleId) 
      select user; 
    } 
    } 
    return null; 
} 
関連する問題