2016-12-15 9 views
0

私はasp.net(C#)のウェブサイトで作業しています。ログインしているすべてのユーザーに権限を与えたい(権限がないWebページを開くように制限する)。私は2つのテーブルのユーザーとロールをSql Serverでロールを取得したいところから&そのユーザーを承認します。データベースからユーザを認証するC#

答えて

1

ユーザーとロールには多対多の関係があるため、ユーザーとロールの間に別のジャンクション・テーブルが存在します。ストアドプロシージャを使用して、ユーザのアクセスを検証したい場合は

var user = Session["UserName"]; // getting logged in user 
var role = // query that junction table **UserRoles** to get all the roles this current user has 
+0

私はasp.net IDもMVCも使用していません。その単純なasp.net Webサイトです。私はSQL SPのみでユーザーを検証しています。 –

0

:だから、今どんなリクエストに応じて次の操作を実行しますグローバルなフィルター/ハンドラを設計しますUserRoles

になりましょうユーザーのロールを格納するために

1)余分なテーブル - さんがUserXRole

それを呼ぶことにしましょう:あなたは、以下が必要になります2)ストアドプロシージャまたはユーザーロールを取得する、またはユーザーが特定のロールを持っているかどうかを確認するユーザー定義関数。以下のような何か:

CREATE PROCEDURE dbo.UserHasRole 
(
    @UserId INT, 
    -- if you provide role name or code, an extra join with dbo.Role is required 
    @RoleId INT 
) 
AS 
BEGIN 
    DECLARE @result BIT = (CASE 
     WHEN EXISTS (
      SELECT 1 
      FROM dbo.UserXRole X 
      WHERE X.UserId = @UserId AND X.RoleId = @RoleId) THEN 1 
     ELSE 0) 

    RETURN @result   
END 

コードは、ユーザー定義関数の制限に従うので、あなたは、BITを返す関数にそれを変更することができます。認証ロジックが将来複雑になる可能性があると思われる場合は、ストアドプロシージャのままにしておきます。

3)ユーザー認証を検証するたびに、現在ログオンしているユーザー識別子

を使用して手順を呼び出して、私はSessionオブジェクトにログインしたユーザーに関する情報を置くことを期待しています。

何かを実行するためにユーザーが特定の役割を持っていることを確認することは、現在のユーザーID(例:Session["UserId"])と必要な役割(RoleId)でストアドプロシージャを呼び出すことを意味します。

上記のアプローチはうまくいくはずですが、データベースへの呼び出しが多くなることがあります。

1)認証時にすべてのユーザー役割をキャッシュする - ユーザーが認証されると、すべての役割がセッション内のリストに格納されます。例えば:

Session["CurrentUserRoles"] = rolesFromDb.Select(r => r.RoleId).ToList(); 

2)ユーザーが役割はメモリ内でのみ行われているかどうかの確認。たとえば、

bool hasSomeRole = (Session["CurrentUserRoles"] as IList<int>)?.Contains(someRoleId) ?? false; 

これは問題ではありません。提案されたソリューションの1つを試してください。

関連する問題