【发布时间】:2018-06-19 00:18:26
【问题描述】:
在我的基本 API 控制器类构造函数中,我根据 Windows 身份验证填充用户权限。我正在使用类似的东西
var ctx = new PrincipalContext(ContextType.Domain, System.Environment.UserDomainName.ToUpper());
var userInfo = UserPrincipal.FindByIdentity(ctx, System.Environment.UserName.ToUpper());
从 AD 获取用户信息。问题是当用户被锁定时,应用程序失败并显示 500,因为异常发生在构造函数中。有没有办法处理这些调用的异常并将其作为未经授权的异常或其他东西冒泡?我试图用 try catch 包围它并抛出未经授权的 httpresponse 异常,但它仍然冒泡为 500。
编辑#1
构造函数中发生的事情很少,当它失败时,我不想以 500 失败。我需要捕获异常并抛出其他东西。授权只是其中之一。
编辑#2
致所有写我不应该在构造函数中包含任何逻辑的人:
构造函数用于将对象初始化为有效状态。这部分应用程序的控制器必须有一个数据库连接、用户信息和一些其他属性,因为所有请求都在使用所有这些信息。如果其中任何一个失败,我想向用户返回不同类型的错误。在标准类的情况下,它将是不同类型的异常(SqlException、DbConnectionException、某种 AD 异常)。对于 WebApi,我希望它是不同类型的响应代码(未授权、未实现(501)等)。将相同的代码复制粘贴到应用程序该部分中的每个请求表示维护问题。
【问题讨论】:
-
在整个应用程序部分的每个方法中复制粘贴相同的代码?这比在构造函数中有这样的逻辑还要糟糕。请阅读问题:无论构造函数中抛出什么类型的异常(即使我将其转换为 400、401 或其他),webapi 都会将其转换为 500。我想知道如何避免它被翻译成 500。就这么简单。
标签: c# asp.net-web-api active-directory windows-authentication