从 AngularJS/ADAL.js 客户端访问 WebApI 时出现 401 未经授权的错误

古拉姆

我有一个带有角度前端的自托管 Web api 应用程序,我现在需要开始通过 Azure Active Directory 对用户进行身份验证。

我已经下载了 SinglePageApp 示例,并且已经设置并成功运行。https://github.com/Azure-Samples/active-directory-angularjs-singlepageapp-dotnet-webapi

在对我自己的应用程序应用必要的更改时,我可以成功地将用户重定向到 Azure 登录屏幕并使用 adal.js/adal_angular.js 取回 userProfile。每当我调用我的 API 时,我都会收到 401 个未经授权的错误,但是使用 Fiddler,我可以看到不记名令牌被添加到每次调用的 HTTP 标头中。

这是我的 AdalAngular 设置:

.config(["$httpProvider", "adalAuthenticationServiceProvider", ($httpProvider, adalProvider) => {
            adalProvider.init(
            {
                instance: "https://login.microsoftonline.com/",
                tenant: "<snip>.onmicrosoft.com",
                clientId: "<snip>",
                extraQueryParameter: "nux=1",
                cacheLocation: "localStorage" // enable this for IE, as sessionStorage does not work for localhost.
            },
            $httpProvider);

这是我的 startup.cs 代码:

public void Configuration(IAppBuilder appBuilder)
    {

        ConfigureWebApi(appBuilder);
        ConfigureAuth(appBuilder);
        ConfigureFileSystem(appBuilder);
        appBuilder.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
    }

private void ConfigureWebApi(IAppBuilder appBuilder)
    {
        // Configure Web API for self-host. 
        HttpConfiguration config = new HttpConfiguration();
        config.MapHttpAttributeRoutes();
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        appBuilder.UseWebApi(config);
    }

    private void ConfigureAuth(IAppBuilder app)
    {
        app.UseWindowsAzureActiveDirectoryBearerAuthentication(
            new WindowsAzureActiveDirectoryBearerAuthenticationOptions
            {
                Tenant = ConfigurationManager.AppSettings["ActiveDirectoryTenant"],
                Audience = ConfigurationManager.AppSettings["ActiveDirectoryApplicationId"]
            });
    }

    private void ConfigureFileSystem(IAppBuilder appBuilder)
    {

        //Set the Welcome page to test if Owin is hosted properly
        appBuilder.UseWelcomePage("/welcome.html");
        appBuilder.UseErrorPage(new Microsoft.Owin.Diagnostics.ErrorPageOptions() { ShowExceptionDetails = true });
        var physicalFileSystem = new PhysicalFileSystem(@".\wwwroot");
        if (ConfigurationManager.AppSettings.AllKeys.Contains("ContentPath"))
        {
            var path = ConfigurationManager.AppSettings["ContentPath"];
            physicalFileSystem = new PhysicalFileSystem(path);
        }
        FileServerOptions fileOptions = new FileServerOptions();

        fileOptions.EnableDefaultFiles = true;
        fileOptions.RequestPath = PathString.Empty;
        fileOptions.FileSystem = physicalFileSystem;
        fileOptions.DefaultFilesOptions.DefaultFileNames = new[] { "index.html" };
        fileOptions.StaticFileOptions.FileSystem = fileOptions.FileSystem = physicalFileSystem;
        fileOptions.StaticFileOptions.ServeUnknownFileTypes = true;
        appBuilder.UseFileServer(fileOptions);
    }

ActiveDirectoryTenant 和 ActiveDirectoryApplicationId 在我的 app.config 中,并且与我的 angular adalProvider.init 代码中配置的内容完全匹配。

最后,我的ApiController看起来像这样:

 [Authorize]
[RoutePrefix("api/connection")]
public class ServerConnectionController : ApiController
{
    [Route("all")]
    [HttpGet]
    public HttpResponseMessage GetAllConnections()
    {
        HttpResponseMessage response;
        try
        {
            string owner = ClaimsPrincipal.Current.FindFirst(ClaimTypes.NameIdentifier).Value;
            var connections = _iDataAccess.GetAllConnections().ToList();
            response = Request.CreateResponse(HttpStatusCode.OK, connections);
        }
        catch (Exception ex)
        {
            response = GetExceptionResponseMessage(ex);
        }

        return response;
    }
}

如前所述,Fiddler 捕获的 HTTP 请求标头看起来没问题,我的 ADAL.js userInfo.profile 上的 aud 属性是正确的 appid。

关于可能缺少什么的任何建议?请注意,这不是基于 Web 的本机应用程序,它是自托管的,这意味着 Web 服务作为 Windows 服务在本地主机上运行,​​而不是在 IIS 中。

我已将站点配置为使用 HTTPS,但无论 HTTP 或 HTTPS 流量如何,我都会遇到同样的问题。

感谢收听!

马库斯·赫格伦德

您需要将 声明ConfigureAuth(appBuilder);为 Startup.cs 配置方法的第一行。您可以在此处找到有关为什么需要将其声明为第一个的很好的解释

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从angular访问webapi时出现401未经授权的错误

来自分类Dev

在结构2上执行st2命令时,出现“ 401客户端错误:未经授权”

来自分类Dev

在改装中出现401未经授权的错误?

来自分类Dev

RTSP出现401(未经授权)错误

来自分类Dev

使用简单访问API(API密钥)在我的YouTube帐户中上传视频时出现错误“ 401未经授权”

来自分类Dev

Kubernetes客户端python API错误401-未经授权

来自分类Dev

尝试获取api时出现Axios错误401(未经授权)错误

来自分类Dev

401未经授权的错误访问CSS文件MVC

来自分类Dev

适用于PATCH方法的OAuth 1.0单腿客户端“ HTTP 401未经授权的错误”

来自分类Dev

在Grails应用中使用Spring Security Rest插件调用登录时出现401未经授权的错误

来自分类Dev

使用jQuery的$ .get和GMail API时出现401(未经授权)错误

来自分类Dev

使用python查询youtube api的播放列表时出现“ HTTP错误401:未经授权”

来自分类Dev

在Grails应用中使用Spring Security Rest插件调用登录时出现401未经授权的错误

来自分类Dev

使用python查询youtube api的播放列表时出现“ HTTP错误401:未经授权”

来自分类Dev

使用C#上传文件时出现远程服务器错误(401)未经授权

来自分类Dev

twitter登录:401客户端错误:需要授权

来自分类Dev

curl 401未经授权的错误

来自分类Dev

JAX-WS Web服务客户端-“响应:URL的'401:未经授权'”

来自分类Dev

Tumblr.js 401 未经授权

来自分类Dev

Passport js错误401:invalid_client找不到OAuth客户端

来自分类Dev

获取 401 - 调用受 Identity Server 3 保护的 .Net Core 2.2 API 时出现未经授权的错误

来自分类Dev

致电客户服务导致401未经授权

来自分类Dev

当客户端-服务器连接是基于 ssh 密钥时,通过 ssh 未经授权访问服务器

来自分类Dev

我尝试使用PHP代码调用发布请求,但出现401未经授权错误。

来自分类Dev

尝试在客户端注释中访问编辑模式时出现xpages错误

来自分类Dev

Google BigQuery错误401讯息:处理大量资料时未经授权

来自分类Dev

克隆存储库时,git-tfs返回“(401)未经授权”错误

来自分类Dev

我尝试从具有JWT令牌的API发出GET请求时遇到错误401(未经授权)

来自分类Dev

克隆存储库时,git-tfs返回“(401)未经授权”错误

Related 相关文章

  1. 1

    从angular访问webapi时出现401未经授权的错误

  2. 2

    在结构2上执行st2命令时,出现“ 401客户端错误:未经授权”

  3. 3

    在改装中出现401未经授权的错误?

  4. 4

    RTSP出现401(未经授权)错误

  5. 5

    使用简单访问API(API密钥)在我的YouTube帐户中上传视频时出现错误“ 401未经授权”

  6. 6

    Kubernetes客户端python API错误401-未经授权

  7. 7

    尝试获取api时出现Axios错误401(未经授权)错误

  8. 8

    401未经授权的错误访问CSS文件MVC

  9. 9

    适用于PATCH方法的OAuth 1.0单腿客户端“ HTTP 401未经授权的错误”

  10. 10

    在Grails应用中使用Spring Security Rest插件调用登录时出现401未经授权的错误

  11. 11

    使用jQuery的$ .get和GMail API时出现401(未经授权)错误

  12. 12

    使用python查询youtube api的播放列表时出现“ HTTP错误401:未经授权”

  13. 13

    在Grails应用中使用Spring Security Rest插件调用登录时出现401未经授权的错误

  14. 14

    使用python查询youtube api的播放列表时出现“ HTTP错误401:未经授权”

  15. 15

    使用C#上传文件时出现远程服务器错误(401)未经授权

  16. 16

    twitter登录:401客户端错误:需要授权

  17. 17

    curl 401未经授权的错误

  18. 18

    JAX-WS Web服务客户端-“响应:URL的'401:未经授权'”

  19. 19

    Tumblr.js 401 未经授权

  20. 20

    Passport js错误401:invalid_client找不到OAuth客户端

  21. 21

    获取 401 - 调用受 Identity Server 3 保护的 .Net Core 2.2 API 时出现未经授权的错误

  22. 22

    致电客户服务导致401未经授权

  23. 23

    当客户端-服务器连接是基于 ssh 密钥时,通过 ssh 未经授权访问服务器

  24. 24

    我尝试使用PHP代码调用发布请求,但出现401未经授权错误。

  25. 25

    尝试在客户端注释中访问编辑模式时出现xpages错误

  26. 26

    Google BigQuery错误401讯息:处理大量资料时未经授权

  27. 27

    克隆存储库时,git-tfs返回“(401)未经授权”错误

  28. 28

    我尝试从具有JWT令牌的API发出GET请求时遇到错误401(未经授权)

  29. 29

    克隆存储库时,git-tfs返回“(401)未经授权”错误

热门标签

归档