如何从同一 Azure AD 中的另一个 Web 应用程序访问 Web api?

Posted

技术标签:

【中文标题】如何从同一 Azure AD 中的另一个 Web 应用程序访问 Web api?【英文标题】:How to access web api from another web app which is in same Azure AD? 【发布时间】:2019-03-14 14:56:17 【问题描述】:

我在 azure and register that application into Azure AD. 上托管了一个网络 API ProductInfo

我还有另一个 web app UIProduct 和这个 Web 应用程序 want to access the web api ProductInfo 都在同一个域和同一个 Azure AD 中。

如何从 web app UIProduct 访问 web api ProductInfo ? 我需要再次生成任何令牌吗?

任何示例代码都会有所帮助。 取自 link 的代码示例

成功登录后,我在主页,然后我点击关于我写这篇文章的页面

    public async System.Threading.Tasks.Task<ActionResult> About()
    
        AuthenticationResult result = null;

        string userObjectID = ClaimsPrincipal.Current.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier").Value;
        AuthenticationContext authContext = new AuthenticationContext(Startup.Authority, new NaiveSessionCache(userObjectID));
        ClientCredential credential = new ClientCredential(clientId, clientSecret);
        result = await authContext.AcquireTokenSilentAsync("App ID URI", credential, new UserIdentifier(userObjectID, UserIdentifierType.UniqueId));

        HttpClient client = new HttpClient();
        HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "https://demotest.azurewebsites.net/api/getdata");
        request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken);
        HttpResponseMessage response = await client.SendAsync(request);

出现异常 - “无法以静默方式获取令牌,因为没有令牌 在缓存中找到。调用方法 AcquireToken"

【问题讨论】:

我已尽我所能回答,但我建议您清理问题的格式并提供有关您尝试构建的体验的更多信息。有点不清楚究竟是什么让你感到困惑,如果我的答案遗漏了什么,请告诉我! 您希望一个广告应用访问另一个广告应用? 是的!我尝试了此代码示例,但未能为 webapi 生成令牌,但无法生成令牌 azure.microsoft.com/en-in/resources/samples/… 【参考方案1】:

您需要在 Azure portal 中将这两个应用程序都注册为 Web 应用程序/API。

然后在您的 Web API 中,设置 App ID URI 并创建您想要公开的任何范围。如果这是您将使用的唯一客户端,您可能只能拥有一个 Access 范围,但请记住,这是最终用户在同意您的应用时将看到的内容。

然后,您可以在您的网络应用程序中为这个新的网络 API 和范围设置 Required Permissions。这表明客户端应该需要对此 Web API 的同意,并且可以为其授予访问令牌。

This code sample 涵盖了这个确切的场景。

web API basics 文档还涵盖了与此场景相关的一些概念信息

【讨论】:

非常感谢我明白了,但我面临的问题是示例代码是 .net 核心,我正在使用 mvc web 应用程序,我在我的 webapp mvc User.FindFirst 中找不到此代码在class ClaimsPrincipal 里面我可以用任何 nuget 来申请 mvc 吗? .NET core MVC 你来了! 不,它的ASP.NET Core web application 我正在处理ASP.NET MVC Asp.Net MVC from here 中没有一些代码 这是给 .Net Core 的,我想要它给 .Net MVC 啊,我的错,以为你在寻找 .NET 核心。在我链接的初始代码示例中,我相信 Web App 是一个 MVC 应用程序。 MVC component。如果我遗漏了一些细微的东西,而不是 .NET 专家,请道歉:)

以上是关于如何从同一 Azure AD 中的另一个 Web 应用程序访问 Web api?的主要内容,如果未能解决你的问题,请参考以下文章

Azure SQL - 如何将 AD 用户添加到 SQL 池数据库

前端 ASP.NET MVC4 作为一个项目,ASP.NET Web API 作为同一解决方案中的另一个项目 - 如何从前端调用 WebAPI?

使用 JWT 令牌保护 asp.net 核心 Web api 时如何从 Azure AD 获取用户

将数据从一个网站集获取到同一 Web 应用程序共享点 2016 中的另一个网站集

Azure AD 身份验证令牌未通过 Web api 授权

如何在 ASP.NET Core 3 上同时使用 Azure AD 身份验证和身份?