我可以针对未经授权或未经身份验证抛出的.NET异常


78

我有部分代码想要在用户未通过身份验证/未授权的情况下引发异常。

因此,我想知道是否还没有针对这些的C#标准,而不是编写自己的NotAuthenticatedException和NotAuthorizedException。

我可以想象很多程序都会抛出类似的异常,如果每个人都再次“写自己的轮子”,那将不是很有用。


4
您可能会同时使用SecurityException这两种情况。
尖刺

1
抛出新的NotAuthorizedException有什么问题?如果您认为它没有被充分封装,只需将其封装在静态类中即可。
芬迪

1
@Fendy很确定,他的意思是编写自己NotAuthorizedException,而不是实际的代码throw new NotAuthorizedException();……
anaximander 2013年

1
在asp.net中,我使用HttpException(401,“ Unauthorized”)响应。我自己的HttpUnauthorizedExeption():base((int)HttpStatusCode.Unauthorized,“ Unauthorized”){},以提高可读性
Liero 2014年

1
@Liero为什么在可能是数据级授权的情况下引发Http Exceptions?例如,Dirk可能想引发NotAuthorisedException,因为用户无权访问特定客户的记录?
雅克2015年

Answers:


31

19
我认为这些异常不适用于授权失败或未经身份验证(匿名)的用户。它们旨在用于客户端提供无效凭据的情况,这与根本不提供任何凭据不同。
2013年

1
我认为AuthenticationException是完全有效的。直接来自MSDN:当无法对客户端或服务器进行身份验证时,类将引发此异常,这就是OP所要求的。我相信,正如您和其他人所讲的那样,Aushorrization可能会有更好的选择SecurityException
达伦(Darren)2013年

7
我不同意你的解释。MSDN说,这些异常用于“当身份验证流的身份验证失败时”,即在对客户端进行身份验证的过程中。我对OP的了解是,身份验证过程已经完成,他需要决定是否授权匿名用户或已身份验证的用户。
2013年

20
身份验证不是授权。例如,可以将某人认证为“禁止用户”,但不会被授权使用该网站。
Sedat Kapanoglu 2013年

1
@DarrenDavies对不起,我认为InvalidCredentialsException是用于授权而非身份验证的。这就是为什么我想指出两个概念不同的原因。OP可能仍在考虑这一点。他写问题的方式暗示了这一点。
Sedat Kapanoglu

57

您还可以将UnauthorizedAccessException用于授权违规


13
这个名称听起来不错,但是文档说“包装Windows API调用的方法通常会抛出UnauthorizedAccessException异常”。对于此问题中提出的方案,这可能会产生误导。抛出自定义异常比重用用于完全不同上下文的框架异常更好。
G-Mac

2
我认为MS注释中的关键词是“通常”,这表明后面的文字是一个例子。如果我要查看捕获了UnauthorizedAccessViolation的代码,我会认为已经进行了未经授权的访问尝试,而不一定是通过“包装Windows API调用的方法”进行的。
Gruff Bunny 2014年

7
因此,现在我承认确实是在割头发,但是PrivilegeNotHeldException继承自UnauthorizedAccessException,这意味着任何处理UnauthorizedAccessException的try / catch块都将尝试处理该异常,这不是您打算发生的情况。这很夸张,有点夸张,但是如果您正在编写一个聊天程序,并且检测到两个参与者之间发生了争吵,您会抛出ArgumentException吗?您不是要隐含围绕异常的语义,该语义与原始异常是为其他人使用或使用的那些不匹配的吗?
G-Mac

应当指出,Windows API调用引发此异常的原因通常是因为用户没有访问文件/文件夹的权限。因此,它仍然符合通用的未授权例外的总体主题。
乔纳森·艾伦

我同意@ G-Mac UnauthorizedAccessException似乎不适用于这种情况
woodbase

9

为了避免重新发明轮子,我将使用PrincipalPermission.DemandPrincipalPermissionAttribute

SecurityException如果需求失败,将为您抛出A。

如果确实要显式引发异常而不是使用PrincipalPermission.Demand,则可以考虑重用现有的System.UnauthorizedAccessException类型。,在MSDN中将其描述为:

当操作系统由于I / O错误或特定类型的安全错误而拒绝访问时引发的异常。

拒绝访问的是您的应用而不是操作系统,但可能足够接近。


IIRC,我们不应该自己抛出SystemException派生类。它们不适合一般使用。
Sedat Kapanoglu 2013年

4
@ssg,我不同意。MSDN异常处理准则(msdn.microsoft.com/en-us/library/seyhszts.aspx)指出“在大多数情况下,使用预定义的异常类型”。

我看到您的MSDN并提出了自己的建议:“不要故意从您自己的源代码中引发System.Exception,System.SystemException,System.NullReferenceException或System.IndexOutOfRangeException。” msdn.microsoft.com/en-us/library/ms173163.aspx
Sedat Kapanoglu 2013年

@ssg-...因此,根据暗示,您可以从自己的代码中引发其他内置的异常类型。

8
@ssg-好吧,它也禁止System.Exception,并且显然这不适用于其派生类。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.