C# 在ASP.net中使用Kerberos时如何避免HTTPResponseException?
我接手的一个项目是ASP.NET、C#和React,它没有太好的文档记录。在VisualStudio(Professional 2017)的调试模式中,我最初一直会遇到一系列错误,单击“继续”几次可以忽略这些错误。Visual Studio中的输出内容如下:C# 在ASP.net中使用Kerberos时如何避免HTTPResponseException?,c#,asp.net,reactjs,visual-studio,kerberos,C#,Asp.net,Reactjs,Visual Studio,Kerberos,我接手的一个项目是ASP.NET、C#和React,它没有太好的文档记录。在VisualStudio(Professional 2017)的调试模式中,我最初一直会遇到一系列错误,单击“继续”几次可以忽略这些错误。Visual Studio中的输出内容如下: myProject.API.dll中发生类型为“System.Web.Http.HttpResponseException”的异常,但未在用户代码中处理 HTTP请求的处理导致异常。 有关详细信息,请参阅此异常的“response”属性返回
myProject.API.dll中发生类型为“System.Web.Http.HttpResponseException”的异常,但未在用户代码中处理
HTTP请求的处理导致异常。
有关详细信息,请参阅此异常的“response”属性返回的HTTP响应。
相应的代码可能是myProject.BSTB.API\Filters\UserAuthenticationFilter.cs
:
namespace myProject.API.Filters
{
public class UserAuthenticationFilter : ActionFilterAttribute
{
// ... some other code
public override void OnActionExecuting(HttpActionContext actionContext)
{
var name = HttpContext.Current.User.Identity.Name;
ServiceLocator sl = new ServiceLocator();
User user = null;
try { user = sl.User.GetUserByName(name); } catch (Exception ex) { throw; }
if (user == null)
{
throw new HttpResponseException(
new HttpResponseMessage(HttpStatusCode.Unauthorized) {
ReasonPhrase = "Unauthorize request: User not valid: " + name});
}
HttpContext.Current.Items.Add(Common.CURRENT_CONTEXT_USER, user);
base.OnActionExecuting(actionContext);
}
}
}
有人告诉我:
由于系统使用NTLM身份验证,并且凭据不会在第一次调用服务器时发送,因此服务器将发送错误响应,凭据将与第二次请求一起发送。因此,预期服务器在开始时会有user==null
,并抛出大量HTTP错误,这是期望的行为
编辑:我认为我们实际上更倾向于使用Kerberos,我们实际上执行的是授权而不是身份验证,请参见示例
有趣的是,其他开发人员无法重现这个问题,因此它可能必须与我设置VisualStudio的方式有关
显然,每次在VisualStudio中开始运行代码时,我都要多次单击Continue按钮,这是浪费时间如何调整代码,使此错误不再显示?是否只有Visual Studio中的配置或我应该添加的其他代码?
编辑
user
来自另一个服务my.service\UserService.cs
,该服务的内容如下
namespace myProject.Service
{
public class UserService
{
private projectContext _db;
internal UserService(projectContext db)
{
_db = db;
}
public User GetUserByName(string name)
{
return _db.Users.SingleOrDefault(x => x.UserName == name);
}
当您使用Windows身份验证时,您不需要编写自己的身份验证筛选器—顺便说一句,Windows身份验证使用Kerberos,而不是NTLM。用户已通过客户端的身份验证。当您调用
Identity.Name
时,身份验证阶段已经结束。为什么要使用这个代码?GetUserByName
做什么?您可能正在寻找授权吗?为什么您首先要编写此筛选器?你想用它做什么?几乎所有ASP.NET教程(无论堆栈如何)都显示了如何使用Windows身份验证。身份验证意味着找出用户是谁,而不是他/她是否拥有使用该应用程序的权限。这是授权,这也包括在大多数教程中。@ PANAGIOTIKSANAVOS:我没有线索,为什么这个过滤器是写的,我是新的ASP.NET和Cyz,反应(我知道一些C++,一些反应本地,Python,Pearl……)。我刚刚接手了这个项目,我只是想修复前端错误。:-/PS:我添加了一些关于用户名来源的代码。嗯,写得很糟糕。try{user=sl.user.GetUserByName(name);}catch(Exception ex){throw;}
与普通的user=sl.user.GetUserByName(name)没有什么不同代码>因为它只是重新引发异常。无论身份验证或授权失败,HttpStatusCode.Unauthorized
响应都是合适的,所以需要它。另一方面,如果代码正确使用ASP.NET的基础结构,响应将是自动的。@PanagiotisKanavos:我想你是对的,这是关于授权的。我的意思是,我被要求输入我的Windows密码(该密码不存储在myProject
DB中),但只有当我的用户ID存储在myProject DB中时,我才被允许访问该应用程序。-你到底建议什么样的清理?