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

Dir*_*oer 68 c# authentication authorization exception

我有部分代码,我想在用户未经过身份验证/未授权时抛出异常.

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

我可以想象很多程序会抛出类似的异常,如果每个人都"再次编写自己的轮子"就不会有用.

Gru*_*nny 52

您还可以使用UnauthorizedAccessException进行授权违规

  • 这个名字听起来不错,但文档说"通常由包装Windows API调用的方法引发UnauthorizedAccessException异常." 对于此问题中提出的情况,这可能会产生误导.最好抛出一个自定义异常,而不是重用一个用于完全不同的上下文的框架异常. (9认同)
  • 所以现在我确实分裂了头发,但是PrivilegeNotHeldException继承自UnauthorizedAccessException,这意味着任何处理UnauthorizedAccessException的try/catch块都会尝试处理该异常,这不是你想要发生的事情.这是一种修辞而且有点延伸,但是如果你正在编写一个聊天程序,并且检测到两个参与者之间发生了争吵,你会抛出一个ArgumentException吗?您是不是试图暗示异常的语义与原始异常所针对的或其他人使用的异常相匹配? (6认同)
  • 我认为MS评论中的关键词是"通常",这表明后面的文字就是一个例子.如果我要查看一些捕获了UnauthorizedAccessViolation的代码,我会认为已经进行了未经授权的访问尝试,而不一定是"一个包装Windows API调用的方法". (2认同)

Dar*_*ren 27

使用C#AuthenticationExceptionInvalidCredentialException类.

http://msdn.microsoft.com/en-us/library/system.security.authentication.authenticationexception.aspx

  • 身份验证不是授权.例如,可以将其认证为"禁止用户",但不会被授权使用该站点. (17认同)
  • 我不认为这些例外适用于失败的授权或未经身份验证的(匿名)用户.它们旨在用于客户端提供无效凭据的情况,这与不提供任何凭据的情况不同. (15认同)
  • 我不同意你的解释.MSDN说这些例外用于"当身份验证流的身份验证失败时",即在验证客户端的过程中.我对OP的情况的解读是认证过程已经完成,他需要决定是否授权匿名用户或经过身份验证的用户. (7认同)

Joe*_*Joe 9

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

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

如果您确实希望显式抛出异常而不是使用异常PrincipalPermission.Demand,则可以考虑重用现有类型System.UnauthorizedAccessException,它在MSDN中描述为:

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

这是你的应用程序,而不是拒绝访问的操作系统,但可能足够接近.

  • @ssg - 嗯,它也禁止System.Exception,显然这不适用于它的衍生物. (6认同)
  • @ssg,我不同意.MSDN异常处理指南(http://msdn.microsoft.com/en-us/library/seyhszts.aspx)声明"在大多数情况下,使用预定义的异常类型". (3认同)