승인되지 않음 또는 인증되지 않음에 대해 던질 수있는 .NET 예외


78

사용자가 인증되지 않았거나 권한이 없을 때마다 예외를 던지고 싶은 코드 부분이 있습니다.

따라서 내 자신의 NotAuthenticatedException 및 NotAuthorizedException을 작성하는 대신 이에 대한 C # 표준이 아직 없는지 궁금합니다.

많은 프로그램이 유사한 예외를 던지는 것을 상상할 수 있으며 모든 사람이 다시 '자신의 휠을 작성'하면별로 유용하지 않을 것입니다.


4
SecurityException두 시나리오 모두에 사용할 수 있습니다 .
취기

1
새로운 NotAuthorizedException throw의 문제점은 무엇입니까? 충분히 캡슐화되지 않았다고 생각되면 정적 클래스로 캡슐화하십시오.
Fendy

1
@Fendy 확신 그는 자신의 기록을 의미 자신의 NotAuthorizedException 아닌 실제 코드 throw new NotAuthorizedException();...
아낙

1
asp.net에서는 HttpException (401, "Unauthorized") resp를 사용하고 있습니다. 내 자신의 HttpUnauthorizedExeption () : base ((int) HttpStatusCode.Unauthorized, "Unauthorized") {}
Liero

1
@Liero 데이터 수준 인증이 될 수 있는데 Http 예외를 발생시키는 이유는 무엇입니까? 예를 들어 Dirk는 사용자가 특정 고객의 레코드에 액세스 할 수 없기 때문에 NotAuthorisedException을 발생 시키려고 할 수 있습니다.
Jacques

답변:


31

19
이러한 예외가 인증 실패 또는 인증되지 않은 (익명) 사용자에게는 적절하지 않다고 생각합니다. 이는 클라이언트가 자격 증명을 전혀 제공하지 않는 것과는 다른 잘못된 자격 증명을 제공하는 상황을위한 것입니다.
Joe

1
AuthenticationException이 완벽하게 유효하다고 생각합니다. MSDN에서 직접 : 클라이언트 또는 서버를 인증 할 수없는 경우 클래스에서이 예외를 throw합니다.이 예외는 OP가 요청하는 IMO입니다. 나는 당신과 다른 사람들이 멘티 온드를 가지고 있기 때문에 Authrorization에 더 나은 수업이있을 수 있다고 믿습니다 SecurityException.
Darren

7
나는 당신의 해석에 동의하지 않습니다. MSDN은 이러한 예외가 "인증 스트림에 대한 인증이 실패 할 때"즉, 클라이언트를 인증하는 과정에서 사용된다고 말합니다. OP의 상황에 대한 필자는 인증 프로세스가 이미 완료되었으며 익명 또는 인증 된 사용자를 승인할지 여부를 결정해야합니다.

20
인증은 인증이 아닙니다. 예를 들어 "금지 된 사용자"로 인증 될 수 있지만 사이트를 사용할 권한이 없습니다.
Sedat Kapanoglu

1
@DarrenDavies InvalidCredentialsException이 인증이 아니라 인증을위한 것이라고 생각해서 죄송합니다. 그래서 두 가지 개념이 다르다는 점을 지적하고 싶었습니다. OP는 여전히 그렇게 생각할 수 있습니다. 그가 질문을 쓴 방식은 그것을 암시합니다.
Sedat Kapanoglu

56

권한 위반에 UnauthorizedAccessException 을 사용할 수도 있습니다.


13
이름은 좋게 들리지만 문서에는 "UnauthorizedAccessException 예외는 일반적으로 Windows API 호출을 래핑하는 메서드에서 발생합니다."라고 나와 있습니다. 이 질문에 제시된 시나리오의 경우 잠재적으로 오해의 소지가 있습니다. 완전히 다른 컨텍스트를위한 프레임 워크 예외를 재사용하는 것보다 사용자 지정 예외를 throw하는 것이 좋습니다.
G-Mac

2
MS 발언의 핵심 단어는 '전형적'이라고 생각하는데, 이는 따라야 할 텍스트가 예시임을 시사합니다. UnauthorizedAccessViolation을 포착 한 일부 코드를 살펴보면 'Windows API 호출을 래핑하는 방법'에 의한 것이 아니라 무단 액세스 시도가 이루어 졌다고 생각할 것입니다.
Gruff Bunny

7
그래서 이제는 머리카락을 분할하고 있지만 PrivilegeNotHeldException은 UnauthorizedAccessException에서 상속합니다. 즉, UnauthorizedAccessException을 처리하는 모든 try / catch 블록이 해당 예외를 처리하려고 시도 할 것입니다. 이것은 수사적이며 약간의 스트레칭이지만 채팅 프로그램을 작성하고 두 참가자 사이에서 발생하는 스 패트를 감지하면 ArgumentException이 발생합니까? 원래 예외가 의도했거나 다른 사람이 사용하는 것과 일치하지 않는 예외에 대한 의미를 암시하려고하지 않습니까?
G-Mac

Windows API 호출에서이 예외가 발생하는 이유는 일반적으로 사용자에게 파일 / 폴더에 대한 액세스 권한이 없기 때문입니다. 따라서 여전히 일반 승인되지 않은 예외의 전체 주제에 맞습니다.
Jonathan Allen

나는 동의 @ G-맥 UnauthorizedAccessException이이 시나리오를 잘 될 것 같지 않습니다
woodbase

9

바퀴를 재발 명하지 않으려면 PrincipalPermission.Demand 또는 PrincipalPermissionAttribute를 사용 합니다.

SecurityException요청이 실패하면 A 가 던져집니다.

를 사용하는 대신 명시 적으로 예외를 throw하려면 MSDN에 다음과 같이 설명되어 PrincipalPermission.Demand있는 기존 유형 System.UnauthorizedAccessException을 재사용하는 것을 고려할 수 있습니다.

I / O 오류 또는 특정 유형의 보안 오류로 인해 운영 체제가 액세스를 거부 할 때 throw되는 예외입니다.

액세스를 거부하는 것은 OS가 아닌 앱이지만 아마도 충분히 가깝습니다.


IIRC, 우리는 SystemException 파생물을 스스로 던져서는 안됩니다. 일반적인 사용을위한 것이 아닙니다.
Sedat Kapanoglu

4
@ssg, 동의하지 않습니다. MSDN 예외 처리 지침 ( msdn.microsoft.com/en-us/library/seyhszts.aspx )에는 "대부분의 경우 미리 정의 된 예외 유형 사용"이 명시되어 있습니다.
Joe

나는 당신의 MSDN을보고 내 자신을 제기한다. "당신 자신의 소스 코드에서 의도적으로 System.Exception, System.SystemException, System.NullReferenceException 또는 System.IndexOutOfRangeException을 던지지 마십시오." msdn.microsoft.com/en-us/library/ms173163.aspx
Sedat Kapanoglu

@ssg-... 따라서 암시 적으로 자신의 코드에서 다른 내장 예외 유형을 던질 수 있습니다.
Joe

8
@ssg-음, 또한 System.Exception을 금지하며, 분명히 파생물에 적용 할 수 없습니다.
Joe
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.