본문 바로가기

Programming/.NET

[ASP.NET] 역활(Role)

우리는 역활에 대한 간단한 상황을 아래 글의 '보안트리밍'부분에서 조금 살펴본적이 있습니다.

 

2016/02/19 - [Programming/ASP.NET] - [ASP.NET] 사이트 네비게이션 (sitemap)

 

역활은 사이트내부의 권한에 관한 세부설정기능으로서 각 사용자에 대한 사이트의 사용범위를 제한하고자 하는데 사용되는 기술입니다. 예를 들어 위 글에서도 보았겠지만 일반사용자와 관리자권한이 있는 사용자간에 표시될 수 있는 메뉴항목이 다른경우를 들 수 있겠습니다.

 

역활관리에 관한 공급자는 기본적으로 machine.config.comments에 설정되어 있으며

 

<roleManager enabled="false" cacheRolesInCookie="false" cookieName=".ASPXROLES" cookieTimeout="30" cookiePath="/" cookieRequireSSL="false" cookieSlidingExpiration="true" cookieProtection="All" defaultProvider="AspNetSqlRoleProvider" createPersistentCookie="false" maxCachedResults="25">
        <providers>
            <clear />
            <add connectionStringName="LocalSqlServer" applicationName="/" name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
            <add applicationName="/" name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
            </providers>
</roleManager>

 

필요에 따라 machine.config나 web.config에서 위 설정사항을 재정의할 수 있습니다. machine.config는 서버 전체에 적용되는 경우이고 web.config는 해당 사이트수준에서만 적용되는 경우입니다.

 

아래는 기본적인 속성에 관한 설명입니다.

 

 enabled

 역활관리 사용여부 설정

 cacheRolesinCookie

 역활정보를 쿠키를 통해 저장하고 읽어오도록 합니다. 보안상 좋지 않으므로 false로 지정해 공급자를 통해 역활정보가 관리할것을 권장합니다.

 cookieName

 역활정보를 쿠키에 저장할 경우 해당 쿠키값의 이름을 설정합니다.

 cookieTimeout

 쿠키소멸시간을 설정합니다. 단위는 분입니다.

 cookieRequireSSL

 역활정보가 SSL을 통해 전송되어야 하는 경우 true로 설정합니다.

 cookieSlidingExpiration

 역활정보가 쿠키에 저장될 경우 쿠키만료 방식을 슬라이딩방식으로 할것인지를 지정합니다. 슬라이딩이란 마지막 요청이후부터 30분간 쿠키가 유지됨을 의미합니다. 만약 이 속성이 false라면 최초요청후부터 30분간만 쿠키가 유지될 것입니다.

 cookieProtection

 역활정보가 쿠키에 저장될 경우 쿠키보호 수준을 설정합니다.

 createPersistentCookie

 이 속성이 true라면 역활정보가 쿠키에 저장될 경우 쿠키는 영구히 유지될 것입니다.

 

따라서 웹사이트에서 역활관리를 사용하기 위해서는 roleManager를 활성화해야 합니다.

 

<roleManager enabled="true"></roleManager>

 

역활을 다루기 위해서는 Role 클래스를 사용하며 해당 클래스의 메소드를 호출하는 것으로 역활관리를 수행할 수 있습니다.

 

Roles.CreateRole("admin");

 

역활을 추가합니다.

 

Roles.RoleExists("Admin");

 

추가된 역활은 RoleExists 를 통해 존재여부를 확인할 수 있습니다.

 

string[] roles = Roles.GetAllRoles();

 

GetAllRoles메소드는 추가된 모든 역활을 가져오도록 합니다.

 

string[] users = Roles.GetUsersInRole("Admin");

 

만약 특정 역활에 해당하는 사용자만을 가져오려면 GetUserInRole메소드를 사용하면 됩니다. 반대로 특정 사용자가 소속된 모든 역활을 가져오려면 GetRolesForUser 메소드를 사용합니다.

 

Roles.DeleteRole("Admin");

 

역활 삭제는 DeleteRole메소드를 사용합니다. 다만 역활은 해당 역활에 포함된 사용자가 존재한다해도 삭제되버리는데 이 실수를 방지하려면 다음과 같이 메소드를 호출해야 합니다.

 

Roles.DeleteRole("Admin", true); .

 

두번째 매개변수에 true를 지정하면 해당 역활에 사용자가 포함되어 있는 경우 예외를 발생합니다.

 

Roles.AddUserToRole("anchor37", "Admin");

 

특정 사용자를 생성한 역활에 추가합니다.

 

string[] users = { "anchor37", "anchor38" };

Roles.AddUsersToRole(users, "Admin");

 

다수의 사용자를 한 역활에 추가하는 경우 AddUsersToRole메소드를 사용합니다. 반대로 한명의 사용자를 여러 역활에 추가하는 경우 AddUserToRoles메소드를 사용하고 여러사용자를 여러역활에 추가하는 경우  AddUsersToRoles메소드를 사용합니다.

 

Roles.RemoveUserFromRole("anchor37", "Admin"); .

 

특정역활에서 특정사용자를 제거하려면 RemoveUserFromRole메소드를 사용합니다. 다수의 사용자를 하나의 역활에서 제거하려면 RemoveUsersFromRole메소드를, 다수의 역활에서 하나의 사용자를 제거하려면 RemoveUserFromRoles메소드를, 다수의 사용자를 다수의 역활에서 제거하려면 RemoveUsersFromRoles메소드를 사용하면 됩니다.

 

if (Roles.IsUserInRole("anchor37", "Admin")) {

    Response.Write("안녕하세요. 관리자님");

}

 

특정 사용자가 특정 역활에 소속되어 있는지를 확인하기 위해서는 IsUserInRole메소드를 사용합니다. 아이디를 지정하지 않고 로그인된 사용자 정보를 확용할 경우 다음과 같이 해도 됩니다.

 

if (Roles.IsUserInRole("Admin")) {

    Response.Write("안녕하세요. 관리자님");

 

좀 다른 방법으로

 

string[] user = Roles.FindUsersInRole("Admin", "anchor37");

 

특정 역활에서 지정된 사용자를 찾을 수도 있습니다. 만약 User개체를 사용하는 경우라면 다음과 같이 할 수도 있습니다.

 

if (User.IsInRole("Admin")) {
    //
}

 

결과는 bool값으로 가져옵니다. 윈도우 인증이라면 '도메인\\역활명'형식으로 지정합니다.

 

Roles.DeleteCookie();

 

역활관련 데이터가 쿠키로 저장되는 경우 이 메소드는 관련 쿠키값을 사용자 컴퓨터에서 삭제할 것입니다.

'Programming > .NET' 카테고리의 다른 글

[ASP.NET] WindowsIdentity  (0) 2017.06.21
[ASP.NET] 웹파트(WebParts)  (0) 2017.06.13
[ASP.NET] 역활(Role)  (0) 2017.06.07
[ASP.NET] ChangePassword  (0) 2017.05.30
[ASP.NET] LoginStatus  (0) 2017.05.23
[ASP.NET] 히스토리(History) 관리  (0) 2017.05.17

태그