2012-04-03 13 views
3

はDBから直接取得せずにRoleIdを取得する方法はありゲット?、私たちはでロール名を取得することができます知っている:どのようにASP.NET MVCでRoleID

string[] allRoles = System.Web.Security.Roles.GetAllRoles(); 
string[] allRolesForUser = System.Web.Security.Roles.GetRolesForUser(httpContext.User.Identity.Name); 

しかし、私はroleIdにアクセスする必要があります。

誰かがそれについて考えていますか?

+0

ロールAPIはロールIDを取得する方法を提供しません。私はあなたがカスタムロールプロバイダを作成できると思います。 – Tuan

答えて

2

いいえ。ロールプロバイダは、データソースに関する知識がありません。これは、非常に遅いWebサービスでも、スーパーデラックスNoSQLデータベースでもあります。プロバイダは、主キーとしてのdbを認識しません。

SqlMembershipProviderがあります。しかし、キーを公開すると、Liskovs Substitution Principleに対する違反につながる可能性があります。

ロール名は一意である必要があります。だからあなたは自分自身をデータベースから取り出すことができるはずです。なぜ、単にdbキーの代わりに直接ロール名を使用できないのですか?

+0

ASP.NETロールマネージャにはバグがあります。ロールの重複は許されませんが、ロールの中に空白があり、異なるロールに異なるホワイトスペースを入れると、同じ名前の複数のロールが許可されます。 –

+0

バグは、空白を許可することです。 – jgauffin

+0

しかし、.NETは複数の空白を1つだけ切り捨て、検証する必要があります。 –

0

できません。 ASP.NET MVCは標準FunctonでRoleIdを取得することを許可していませんが、ロール名の助けを借りてデータベースから取得する必要があります。

2

モデルにaspnet_Rolesテーブルを追加し、roleIdを取得するためにクエリ(例:LINQ)を使用する必要があります。メンバーシッププロバイダを変更することはできますが、それを行うにはさらに多くの作業が必要です。

0

私はこれが数年前であることを認識していますが、私はそれにぶつかったときに実際に答えが誰にも完全に答えられたので、完全な解決策を投稿すると思いました。サイコー

...

は、簡単に言えば:

SELECT RoleId, RoleName FROM aspnet_Roles; 
GO 

しかし、ユーザーのRoleIdsを取得するためには、このようなものです:

SELECT UR.RoleID, R.RoleName FROM 
aspnet_Users U, aspnet_Roles R, aspnet_UsersInRoles UR 
WHERE U.UserName = @Username 
AND UR.UserId = U.UserId 
AND UR.RoleID = R.RoleId 
GO 

これはあなたの2列のリストを与えます特定のユーザーのRoleIdsおよびRoleNames。

実際には、RoleIdが公開されたときにセキュリティ違反の可能性があるため、これを行わないでください。 RoleNamesで作業し、メンバシップとロールメソッドを使用して管理する必要があります。

希望します。

関連する問題