Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在ASP.net中使用Kerberos时如何避免HTTPResponseException?_C#_Asp.net_Reactjs_Visual Studio_Kerberos - Fatal编程技术网

C# 在ASP.net中使用Kerberos时如何避免HTTPResponseException?

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”属性返回

我接手的一个项目是ASP.NET、C#和React,它没有太好的文档记录。在VisualStudio(Professional 2017)的调试模式中,我最初一直会遇到一系列错误,单击“继续”几次可以忽略这些错误。Visual Studio中的输出内容如下:

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中时,我才被允许访问该应用程序。-你到底建议什么样的清理?