문제

는 방법을 알아야 합니다 가을 구현하는 방법에 대한 일반적인 보안을 위해서는 C#응용 프로그램입니다.떤 옵션이 있습니까 이런 점에서?내가 사용하는 것을 선호하는 기존의 틀을 충족하는 경우 나의 필요-나는 원하지 않을 재조명하다.

나의 요구 사항은 다음과 같습니다:

  • 일반적인 사용자명/암호 인증
  • 를 관리하는 사용자의 사용 권한을 지정하여 사용자
  • 관리의 역할 사용자를 지정하는 역할,권한을 할당할
  • 의 권한 부여 사용자에 따라 사용자 이름과 역할이

내가 찾는 것은 무료로/오픈 소스 프레임워크/라이브러리는 시간 tesed 에 의해 사용됩니다.Net 커뮤니티입니다.

내 응용 프로그램은 클라이언트/서버 접근 방식,서버가 실행으로 윈도우 서비스에 연결하는 SQL 서버 데이터베이스에 입력됩니다.통신 사이의 클라이언트와 서버를 통해 WCF.

다른 하나는 일은 중요한 것은 내가 해야 할당할 수 있는 특정 사용자 또는 역할 권한을 보려면을 업데이트//삭제는 특정 엔터티를 할 수 있는지,고객 또는 제품 등등.예를 들어,잭 볼 수 있는 특정 3 의 10 대 고객만,업데이트 내용이 고객의 Microsoft,야후,구글,만 삭제할 수 있습니다.

도움이 되었습니까?

해결책

을 위해 거친 세분화된 보안을 찾을 수 있습니다 붙박이 주는 코드 사용사용자 객체(고 자신의 역할을)통제됩니다.여"주"하지만 유용하게 런타임을 자체에 적용할 수 있다.

의 구현을 주체할 수 있는 구현 시 정의,그리고 당신은 일반적으로 주입한 자신; 예를 들어 WCF.

보 런타임 적용을 거친 access(i.e는 기능 액세스할 수 있지만,제한되지 않는 특정 데이터):

static class Roles {
    public const string Administrator = "ADMIN";
}
static class Program {
    static void Main() {
        Thread.CurrentPrincipal = new GenericPrincipal(
            new GenericIdentity("Fred"), new string[] { Roles.Administrator });
        DeleteDatabase(); // fine
        Thread.CurrentPrincipal = new GenericPrincipal(
            new GenericIdentity("Barney"), new string[] { });
        DeleteDatabase(); // boom
    }

    [PrincipalPermission(SecurityAction.Demand, Role = Roles.Administrator)]
    public static void DeleteDatabase()
    {
        Console.WriteLine(
            Thread.CurrentPrincipal.Identity.Name + " has deleted the database...");
    }
}

그러나,이 도움이되지 않으로 세분화된 액세스 권한(i.e"프레드에 액세스할 수 있습 고객지만 고객 B").


추가적인;의 물론 세밀한,당신은 단순히 확인하는 데 필요한 역할 런타임 시에 의해 확인 IsInRole 주:

static void EnforceRole(string role)
{
    if (string.IsNullOrEmpty(role)) { return; } // assume anon OK
    IPrincipal principal = Thread.CurrentPrincipal;
    if (principal == null || !principal.IsInRole(role))
    {
        throw new SecurityException("Access denied to role: " + role);
    }
}
public static User GetUser(string id)
{
    User user = Repository.GetUser(id);
    EnforceRole(user.AccessRole);
    return user;
}

할 수도 있습니다 자신의 쓰기 주체/신원 개체는 일반적으 테스트/캐싱의 역할을 하는 것 보다는 그들을 알아두면:

class CustomPrincipal : IPrincipal, IIdentity
{
    private string cn;
    public CustomPrincipal(string cn)
    {
        if (string.IsNullOrEmpty(cn)) throw new ArgumentNullException("cn");
        this.cn = cn;
    }
    // perhaps not ideal, but serves as an example
    readonly Dictionary<string, bool> roleCache =
        new Dictionary<string, bool>();
    public override string ToString() { return cn; }
    bool IIdentity.IsAuthenticated { get { return true; } }
    string IIdentity.AuthenticationType { get { return "iris scan"; } }
    string IIdentity.Name { get { return cn; } }
    IIdentity IPrincipal.Identity { get { return this; } }

    bool IPrincipal.IsInRole(string role)
    {
        if (string.IsNullOrEmpty(role)) return true; // assume anon OK
        lock (roleCache)
        {
            bool value;
            if (!roleCache.TryGetValue(role, out value)) {
                value = RoleHasAccess(cn, role);
                roleCache.Add(role, value);
            }
            return value;
        }
    }
    private static bool RoleHasAccess(string cn, string role)
    {
        //TODO: talk to your own security store
    }
}

다른 팁

들여다보다 ASP.NET의 멤버십 제공 업체. 나는 당신의 경우 당신의 경우에 상자의 sqlmembershipprovider가 작동하지 않을 것이라고 생각하지 않지만 당신의 공급자를 롤아웃하기에 쉽습니다.

내 대답은 아마도이 질문에 대한 답에 달려있을 것입니다. 이것은 Active Directory가있는 네트워크 내에있는 엔터프라이즈 애플리케이션입니까?

대답이 예라면, 이것이 내가 제공 할 단계입니다.

1) 응용 프로그램에 대한 글로벌 그룹을 만들었습니다. 제 경우에는 AppUser 그룹과 AppAdmin 그룹이있었습니다.

2) 혼합 인증 모드에서 SQL 서버에 액세스 할 수 있도록 한 다음 DB에 적절한 CRUD 권한이있는 SQL Server 로그인으로 AppUser Group을 할당하고 액세스 권한을 부여하십시오. SQL 서버가 있습니다 신뢰할 수있는 연결 = true 연결 문자열에서.

이 시점에서 광고 저장소는 인증을 담당합니다. 신뢰할 수있는 연결을 통해 응용 프로그램에 액세스하므로 응용 프로그램을 SQL 서버로 실행중인 모든 계정의 신원을 전달합니다.

이제 승인을 위해 (즉, 로그인 한 사용자가 허용하는지 응용 프로그램에 알려주는 경우) 로그인 한 사용자가 구성원의 구성원 목록에 대한 광고를 쿼리하는 간단한 문제입니다. 그런 다음 적절한 그룹 이름을 확인하고 회원 자격에 따라 UI를 구축하십시오.

내 응용 프로그램의 작동 방식은 다음과 같습니다.

  1. 애플리케이션 시작, 자격 증명은 로그인 사용자를 기반으로합니다. 이것은 인증의 주요 측면입니다 (즉, 로그인 할 수 있으므로 존재할 수 있음)
  2. 문제의 Windows Identity에 대한 모든 그룹을 얻습니다.
  3. 표준 사용자 그룹을 확인합니다.이 그룹이 문제의 Windows Identity에 대해 존재하지 않으면 인증 실패입니다.
  4. 관리자 그룹을 확인합니다 - 사용자 그룹에 기존이 있으면 UI를 수정하여 관리 구성 요소에 액세스 할 수 있습니다.
  5. UI를 표시하십시오

그런 다음 결정된 권리 등이있는 원칙 객체가 있거나, 내 양식을 작성하는 동안 적절한 UI를 결정하기 위해 액세스 할 수있는 글로벌 변수를 활용합니다 (즉, 사용자가 관리자 그룹의 구성원이 아닌 경우 I 'd 모든 삭제 버튼을 숨 깁니다).

왜 이것을 제안합니까?

배포 문제입니다.

대부분의 엔터프라이즈 애플리케이션은 프로그래머보다는 네트워크 엔지니어에 의해 배포된다는 것이 저의 경험이었습니다. 따라서 인증/승인은 AD의 책임이되도록 인증/승인을 할 때 네트워크 직원이가는 곳이라는 것이 합리적입니다.

또한 네트워크를위한 신규 사용자를 생성하는 동안 네트워크 엔지니어 (또는 새로운 네트워크 사용자를 생성 할 책임이있는 사람)는 AD에있는 동안 그룹 과제를 수행하는 동안 그룹 할당을 수행하는 것이 더 적합합니다. 승인 할당을 구문 분석하기위한 12 개의 신청서.

이를 수행하면 신입 사원을 부여 해야하는 권한과 권리의 미로에 도움이되거나 회사를 떠나는 사람들은 거부해야하며, 그것이 속한 중앙 저장소에서 인증 및 승인을 유지합니다 (즉, AD @ 도메인 컨트롤러 레벨).

나는 csla.net과 같은 것을 보게 될 것이다 : 전문가 C# 2008 비즈니스 개체

필요한 모든 것을 제공해야합니다.

WCF는 풍부한 보안 관련 기능을 가지고 있으며 승인 및 인증을 모두 제공합니다. 자세한 내용은 다음과 같습니다.http://msdn.microsoft.com/en-us/library/ms735093.aspx

여기서 몇 가지 별도의 문제를보고 있다고 생각합니다. 대부분의 보안 시스템 별도의 인증 및 승인 사고는 없습니다.

인증을 위해 더 큰 질문은 물류입니다. 또는이 사용자가 응용 프로그램, Active Directory, 다른 LDAP 상점 또는 다른 응용 프로그램에 현지에서 살 수있는 논리적 인 장소가 있습니까? 정확히 꽤 비 물질적 인 곳은 사용자를 견고하게 식별하고 다른 사람의 문제를 해결할 수 있어야합니다. 하루가 끝나는 것은 실제로 고유 한 식별자가 필요하며 회계에서 Bob이 실제로 회계에서 Bob이라는 편안함이 필요합니다.

승인은 여기서 문제의 더 흥미로운 부분입니다. 나는 그것이 정말로 세밀하다면, 당신은 사용자가 어디에서 왔는지에 관계없이 응용 프로그램 내 에서이 전적으로이 관리를 원한다고 생각합니다. Marc Gravell은 실제로이 중 일부를 모델링하는 좋은 방법을 사용했습니다. Iprincipal 및 PrincipalTermission의 일부 사용자 정의 구현은 시작하는 매우 깨끗한 방법입니다. 그 외에도 당신은 같은 기술을 사용할 수 있습니다 이 하나 보다 복잡한 승인 결정을 다소 깨끗하게 만들기 위해.

'RBAC'(역할 기반 액세스 제어 시스템)라는 용어를 모든 요구 사항에 대한 솔루션으로 사용합니다.

나는 여기서 'rbac'을 설명하기 위해 자세히 설명하지 않을 것입니다. 오히려 나는 그것을 간단히 설명 할 것입니다.

기본적으로 3 가지 기능이 포함되어 있습니다.

1) 인증 - 사용자의 신원을 확인합니다. 일반적으로 사용자 계정 및 암호 또는 자격 증명을 통해 수행됩니다.

2) 승인 - 응용 프로그램에서 사용자가 수행 할 수 있고 수행 할 수없는 일을 정의합니다. 전. '순서 수정'이 허용되지만 '새 순서 만들기'는 허용되지 않습니다.

3) 응용 프로그램에 대한 사용자 조치 감사. - 응용 프로그램에서 사용자의 조치를 추적 할뿐만 아니라 어떤 사용자에게 어떤 액세스를 부여했는지 누가 부여 했습니까?

위키에서 RBAC를 확인할 수 있습니다.

https://en.wikipedia.org/wiki/Role 기반 _access_control

이제 귀하의 요구 사항에 대한 답변과 관련하여 가능한 솔루션 중 하나는 귀하의 요구에 따라 ASP.NET 멤버십을 확장하는 것입니다.

그리고 프레임 워크를 사용할 준비가되어 있으면 권장합니다. 비주얼 가드 내가 일하는 것을 위해, 당신은 이것을 확인해야합니다. 그것은 당신이 매우 쉽게 필요한 것을 수행하며, 가장 중요한 것은 중앙 관리 콘솔을 통한 모든 사용자, 역할, 권한 및 응용 프로그램을 관리하고 권한을 정의하는 것입니다. 관리자는 개발자의 지식이 필요하지 않습니다. 즉, UI를 통해 활동에 대한 제한을 만들 수 있습니다.

또한이 기사에서 허가 및 역할 기반 시스템에 대해 더 많은 이해를 할 수 있습니다.

http://www.visual-guard.com/en/net-powerbuilder-application-security-security-suthentication-acccess-control-rbac-articles/dotnet-security-article-resources/role-access-control- source_soforum.html

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top