通过 Angular 调用时,Windows 身份验证不适用于 WebAPI

     2023-03-04     231

关键词:

【中文标题】通过 Angular 调用时,Windows 身份验证不适用于 WebAPI【英文标题】:Windows Authentication is not working with WebAPI when called through Angular 【发布时间】:2017-03-13 21:49:54 【问题描述】:

我有两个项目,一个是 MVC(使用 Angular),另一个是 WebAPI。 Windows 身份验证在 MVC 中运行良好(感谢article)

但是,当我通过 Angular 从 MVC 站点向 WebAPI 进行 AJAX 调用时,出现以下错误:

HTTP 错误 401.2 - 未经授权 您无权查看此内容 由于身份验证标头无效而导致的页面。

最可能的原因:

在 IIS 中未选择身份验证协议(包括匿名)。 仅启用了集成身份验证,并且使用了不支持集成身份验证的客户端浏览器。 已启用集成身份验证,并且请求是通过代理发送的,该代理在验证标头之前更改了它们 到达网络服务器。 Web 服务器未配置为匿名访问,并且未收到所需的授权标头。 “configuration/system.webServer/authorization”配置部分可能明确拒绝用户访问。

我读到了这个post,但它是在谈论 HttpClient(当我使用 JQuery 或 Angular 时)进行调用。

请注意:如果我通过浏览器点击 WebAPI URL,则身份验证工作正常。所以肯定和AJAX请求有关。

这是我在 Global.asax 中的代码

protected void Application_BeginRequest()

    if (ValidateRequest())
    
        //var origin = Request.Headers["Origin"];
        Response.Headers.Remove("Access-Control-Allow-Origin");

        Response.AddHeader("Access-Control-Allow-Origin", matchedOrigin);

        Response.Headers.Remove("Access-Control-Allow-Headers");
        Response.AddHeader("Access-Control-Allow-Headers", CustomConfig.HEADERS);

        Response.Headers.Remove("Access-Control-Allow-Methods");
        Response.AddHeader("Access-Control-Allow-Methods", CustomConfig.METHODS);
    

    // This is to avoid "Method 405 Not allowed" error
    if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS")
    
        Response.Flush();
        Response.End(); //Send the Empty Response for Options (Preflight Request)
    

我已经进行了足够的研究,但找不到解决方案。这么几件事。

如何解决上述问题 其次,根据我的场景(和项目设置),使用 Windows 身份验证的最佳方法是什么。

【问题讨论】:

【参考方案1】:

如果它直接在浏览器中工作,但在涉及 JavaScript 时不能工作,这将是一个 CORS 问题,因此请检查您是否已启用它,包括处理飞行前 OPTIONS 动词。

在您的情况下,您还需要检查您是否正在传递凭据,例如

[EnableCors(origins: "http://myclient.azurewebsites.net", headers: "*", 
    methods: "*", SupportsCredentials = true)]

注意凭据我认为您不能使用通配符来源 - 需要明确的列表。

查看此链接:https://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api#credentials。

在您的 Angular $http 请求中,确保您拥有 withCredentials: true 属性。

或者,如果您正在进行 JQuery ajax 调用,那么:

xhrFields: 
        withCredentials: true
    

如果您仍然遇到飞行前问题,请尝试使用这样的自定义消息处理程序(更改来源):

    public class ExampleMessageHandler : DelegatingHandler
    
      protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,
            CancellationToken cancellationToken)
        

            if (request.Headers.Contains("Origin") && request.Method.Method == "OPTIONS")
            
                var response = new HttpResponseMessage();
                response.StatusCode = HttpStatusCode.OK;
                response.Headers.Add("Access-Control-Allow-Origin", "http://localhost:8080/");
                response.Headers.Add("Access-Control-Allow-Credentials", "true");
                response.Headers.Add("Access-Control-Allow-Headers", "Origin, Content-Type, Accept, Authorization");
                response.Headers.Add("Access-Control-Allow-Methods", "DELETE, POST, PUT, OPTIONS, GET");
            
            return base.SendAsync(request, cancellationToken);
        
   

然后:

public static void Register(HttpConfiguration config)
    
        config.MessageHandlers.Add(new ExampleMessageHandler());

【讨论】:

我怀疑这是一个 CORS 问题,因为在我在 WebAPI 项目上启用 Windows 身份验证之前它运行良好。我相信它必须对凭据做一些事情,但不知道是什么。 谢谢本。您的建议有效但不完全。现在对于飞行前(选项)请求,我得到 401 未经授权,因为我的研究浏览器不发送选项请求的凭据。我猜 WebAPI 正在寻找凭据。我可以通过关注这篇文章 [link]***.com/a/28439989/1813357 来解决问题,但不确定这是否是一个好的解决方案。 消息处理程序为 GET 请求执行,但它不会被 OPTIONS 请求命中。我正在处理 Global.asax Application_BeginRequest 中的 OPTIONS 动词,就像在示例帖子中所做的那样。 让我们continue this discussion in chat.

为啥 Angular Oninit 仅在离开页面时才调用服务

】为啥AngularOninit仅在离开页面时才调用服务【英文标题】:WhydoesAngularOninitonlycallservicewhennavigatedawayfrompage为什么AngularOninit仅在离开页面时才调用服务【发布时间】:2021-10-0912:23:12【问题描述】:使用Angular路由器,当用户导航到... 查看详情

Angular 5 应用程序的任何组件访问数据。正在通过身份验证服务中的 API 调用设置数据

】Angular5应用程序的任何组件访问数据。正在通过身份验证服务中的API调用设置数据【英文标题】:Dataaccessingbyanycomponentsofangular5application.DataisbeingsetviaaAPIcallinsideauthservice【发布时间】:2019-01-2123:33:47【问题描述】:我有一个共... 查看详情

Angular 7 .net 核心 2.2 WebApi Windows 身份验证 CORS

】Angular7.net核心2.2WebApiWindows身份验证CORS【英文标题】:Angular7.netcore2.2WebApiWindowsAuthenticationCORS【发布时间】:2019-08-2601:13:08【问题描述】:我正在使用带有.netcore2.2和Asp.netWebApi的Angular7,并尝试使用Windows身份验证来识别用户。... 查看详情

打开 Windows 身份验证时使用 ajax 调用 Web 服务?

】打开Windows身份验证时使用ajax调用Web服务?【英文标题】:UsingajaxtocallawebservicewhenWindowsAuthenticationturnedon?【发布时间】:2010-10-0921:28:04【问题描述】:我正在尝试从javascript调用Web服务方法:functionSearch()varcontext=newObject;context.Fil... 查看详情

我如何通过 .net 远程调用模拟经过 Windows 身份验证的 Web 用户?

】我如何通过.net远程调用模拟经过Windows身份验证的Web用户?【英文标题】:howdoiimpersonateawindowsauthenticatedwebuserovera.netremotingcall?【发布时间】:2009-03-2320:34:03【问题描述】:我有一个使用Windows集成安全性的Web应用程序。我还有... 查看详情

在 Internet Explorer 上使用 Windows 身份验证通过 SSL 进行跨域 ajax 调用失败

】在InternetExplorer上使用Windows身份验证通过SSL进行跨域ajax调用失败【英文标题】:crossdomainajaxcalloverSSLwithwindowsauthfailsonInternetExplorer【发布时间】:2012-11-1610:09:12【问题描述】:我有一个使用Windows身份验证的Web应用程序,该应用... 查看详情

如何将 Web api Windows 身份验证与 Angular 应用程序一起使用 [重复]

】如何将WebapiWindows身份验证与Angular应用程序一起使用[重复]【英文标题】:Howtousewebapiwindowsauthenticationwithangularapp[duplicate]【发布时间】:2019-12-1604:18:02【问题描述】:我正在构建一些将使用.net核心webapi的Angular应用程序。当我使... 查看详情

Windows 身份验证和 Angular 4 应用程序

】Windows身份验证和Angular4应用程序【英文标题】:WindowsAuthenticationandAngular4application【发布时间】:2018-02-2003:22:12【问题描述】:我正在编写一个需要从Asp.NetWebApi获取一些数据的Angular4应用程序。我们正在为WebAPI使用Windows身份验... 查看详情

服务器端 webapi 调用上的 Windows 身份验证失败

】服务器端webapi调用上的Windows身份验证失败【英文标题】:Windowsauthenticationfailingonserversidewebapicall【发布时间】:2017-06-0713:13:32【问题描述】:我有一个托管在IIS8上的MVC5Web应用程序,它通过Windows身份验证进行保护。该应用程序... 查看详情

使用 Windows 身份验证登录 Angular App

】使用Windows身份验证登录AngularApp【英文标题】:LogininAngularAppusingwindowsAuthentication【发布时间】:2018-05-1314:24:59【问题描述】:我创建了一个Angular2应用程序。现在,这些是Windows身份验证的要求。1)如果组织内的任何用户访问此... 查看详情

带有 Windows 身份验证预检问题的 Angular 4 HTTP POST [重复]

】带有Windows身份验证预检问题的Angular4HTTPPOST[重复]【英文标题】:Angular4HTTPPOSTwithwindowsauthenticationpreflightissue[duplicate]【发布时间】:2018-01-1116:33:54【问题描述】:我在后端使用Angular4和ASP.NETWebapi2,并启用了Windows身份验证。我有... 查看详情

使用 Windows 身份验证时向身份添加自定义声明

】使用Windows身份验证时向身份添加自定义声明【英文标题】:AddcustomclaimstoidentitywhenusingWindowsauthentication【发布时间】:2018-07-0405:13:30【问题描述】:在.NetMVC应用程序中使用Windows身份验证时,我很难理解如何添加自定义声明。... 查看详情

通过 OAuth 对 Google API 进行经过身份验证的调用时遇到问题

】通过OAuth对GoogleAPI进行经过身份验证的调用时遇到问题【英文标题】:TroublemakingauthenticatedcallstoGoogleAPIviaOAuth【发布时间】:2014-05-1110:48:25【问题描述】:当我尝试使用服务器到服务器身份验证调用GoogleDirectoryAPI时,我收到错... 查看详情

Angular 2 - Twitter 搜索 api - 预检时仅应用程序的身份验证错误 400

】Angular2-Twitter搜索api-预检时仅应用程序的身份验证错误400【英文标题】:Angular2-Twittersearchapi-Application-onlyauthenticationerror400onpreflight【发布时间】:2017-03-0107:51:12【问题描述】:我尝试使用仅限应用程序的身份验证调用twitter搜索... 查看详情

Angular Service 在每次调用时都会重置

】AngularService在每次调用时都会重置【英文标题】:AngularServiceisresetoneachcallofit【发布时间】:2017-11-0519:11:54【问题描述】:在我的网络Angular项目中,我创建了一个AuthenticationGuard和一个AuthenticationService来处理安全问题。这些文件... 查看详情

.NET Core Web API / Angular 应用程序中的 Windows 身份验证

】.NETCoreWebAPI/Angular应用程序中的Windows身份验证【英文标题】:WindowsAuthenticationin.NETCoreWebAPI/Angularapplication【发布时间】:2019-11-3012:50:49【问题描述】:我正在使用VisualStudio2019社区构建一个Intranet应用程序,用于创建.NETCoreWebApi(... 查看详情

如何在 Angular 7 Web 应用程序中安全地进行无密码(重要)Windows 身份验证

】如何在Angular7Web应用程序中安全地进行无密码(重要)Windows身份验证【英文标题】:HowcanIsecurelydopassowordless(Important)windowsauthenticationinanangular7webapplication【发布时间】:2020-09-2515:08:26【问题描述】:如何在Angular7Web应用程序中安... 查看详情

为多个 API 调用重用不记名令牌

...该服务又调用另外两个自己也有的。目前身份验证是通过windows身份验证用户用户/角色处理的。我想在到达aspmvc方面时获得一个身份服务器令牌(仍然使用Windows 查看详情