asp.net - 在 Azure AD 和 Windows Auth/AD 之间转换 token

标签 asp.net web-services azure windows-authentication azure-active-directory

我有一些老式的 .NET ASMX Web 服务,我想从我在 Azure 上托管的 ASP.NET Web 应用程序中使用这些服务。旧服务使用 Active Directory Windows 身份验证(更新)进行身份验证,但 ASP.NET Web 应用程序使用 Azure AD 进行身份验证。允许 Azure AD Web 应用调用那些需要 Windows 身份验证 token 的 ASMX Web 服务的最佳选项是什么?

以下是我今天的 ASMX 服务的设置方式。在 web.config 中:

<authentication mode="Windows" />

还开启了模拟功能:

<system.web><identity impersonate="true"></identity>

Web 服务的代码在其代码内部使用 Windows 标识,因此我们能够解析正确的 Windows 标识非常重要。以下是我们引用用户主体的方式:

System.Security.Principal.WindowsIdentity.GetCurrent().Name

新的 Web 应用程序使用 Microsoft OWIN 进行身份验证设置。我们在 Azure AD 中创建了一个应用程序。因此,我们所拥有的只是来自 Web 应用程序中的 Azure AD 的声明。

更新:我的配置信息似乎有点不对劲。我们没有使用 ADFS,而是在 ASMX 服务中直接使用 Windows Auth。

更新 2:我尝试设置 Azure AD 应用程序代理,将声明转换为我的旧版本地 Web 服务所需的 Windows 身份验证 token 。

所以不要在这里打电话:

https://myServer/MyServices/MyService.asmx

当我在浏览器中访问此 URL 时,我会获得标准的 Windows 身份验证登录,输入我的凭据,然后可以使用 ASMX 服务工具来调用服务方法。

我现在正在调用此 URL:

https://mystuff.msappproxy.net/MyServices/MyService.asmx

有趣的是,当我访问此 URL 时,我会被重定向到 Azure AD 并登录,然后我就可以使用服务方法。当我监控 HTTP 流量时,我注意到在调用 Web 服务时,一个 cookie 被附加到请求中。

AzureAppProxyAccessCookie_{guid}_1.1

但是,当我使用经过 Azure AD 身份验证的网站时,它会对 MyService.asmx Web 服务进行 javascript 调用,并且我收到一个 HTTP 302 FOUND,其 URL 如下所示:

https://login.live.net/{guid}/oauth2/authorize?response_type=id_token&client_id={guid}&redirect_uri=https://mystuff.msappproxy.net/MyServices/MyService.asmx

它似乎试图这样做,但也许 Azure AD 向我的 Web 应用程序颁发的 token 没有转换为 Azure AD 应用程序代理可以使用的 token ?

更新3:

为了进一步隔离问题,我尝试使用硬编码的 html 编码请求正文创建一个示例 Ajax Get 请求。我在我使用的 POC 应用程序之一中创建了示例 jQuery 调用。然而,在浏览器控制台中出现重定向 CORS 错误: https://mystuff.msappproxy.net/

这是我从 Web 应用程序进行的独立 javascript 调用。

    function GetASMX()
{
    $.ajax({
        url: "https://mystuff.msappproxy.net/MyServices/MyService.asmx/DoSomething?parameter=[stuff]",
        type: 'GET',
        xhrFields: {
            withCredentials: true
        },
        crossDomain:true,
        success: function (e) {
            alert('Api App Returns: ' + e);
        }
    });
}

CORS 在 ASMX 端启用。我需要找出为什么会发生这种情况。看起来这可能是 related .

最佳答案

没有明显的方法。在较高级别上,如果您拥有 ADFS 的管理员访问权限,则可以与 Azure AD 租户设置身份提供商信任:这将使您有机会遍历信任链,以便您的 Azure AD 用户可以将 Azure AD token 交换为ADFS 一。 这就是理论。为了进入实现阶段,人们需要有关您当前用于保护对 ASMX 服务的调用的协议(protocol)的更多详细信息。如果您只是制作受 cookie 保护的 ajax callas,那么应该很容易适应 - 您只需获得一个指向 Azure AD 的额外重定向。但如果您使用 ws-security 和 ws-trust,那么您就有麻烦了。 Azure AD 的公共(public)界面不支持这两种协议(protocol),并且在任何情况下,这些协议(protocol)都没有提供处理两个提供商之间的联合流的明确方法。

关于asp.net - 在 Azure AD 和 Windows Auth/AD 之间转换 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33340271/

相关文章:

c# - 增加已启动 session 的超时时间

javascript - 如何在加载时隐藏表格,然后在单击按钮时显示它

c# - 如何确定我的 dll 的托管位置

java - 当我移动 Web 服务时,所有硬编码 URI 会发生什么情况?

java - 如何使用基于 WSDL 的 Web 服务通知客户端(Java、C#)

web-services - 使用客户端证书的 THTTPRIO SSL 无法正常工作

javascript - 有没有办法在服务器端页面加载之前在加载时运行javascript?

azure - 通过 Azure API 管理连接时,WebSocket 服务在收到客户端消息后始终关闭连接

azure - 通过 SPA 上的 API 调用传递 Azure token (JWT)

azure - 如何捕获 cli.azure.cli.core.azclierror : ResourceNotFoundError: in PowerShell