Azure API管理和后端Web API

Azure API管理和后端Web API,azure,asp.net-web-api,oauth-2.0,azure-active-directory,azure-api-management,Azure,Asp.net Web Api,Oauth 2.0,Azure Active Directory,Azure Api Management,我在Azure应用程序服务中部署了一个Web API。Web API使用Azure AD进行保护。我计划使用API管理向各种用户公开API 现在,我已经在API管理中启用了对开发人员门户的基本身份验证。此外,我还为后端服务器启用了OAuth 2.0身份验证(用户授权)。因此,如果我登录到开发者门户,我可以看到两个字段——订阅密钥和授权。订阅密钥将是开发人员对门户的订阅,授权将是后端服务器所需的OAuth授权 此外,如果任何用户需要访问api管理url,则用户需要在查询字符串中传递订阅密钥,并在授

我在Azure应用程序服务中部署了一个Web API。Web API使用Azure AD进行保护。我计划使用API管理向各种用户公开API

现在,我已经在API管理中启用了对开发人员门户的基本身份验证。此外,我还为后端服务器启用了OAuth 2.0身份验证(用户授权)。因此,如果我登录到开发者门户,我可以看到两个字段——订阅密钥和授权。订阅密钥将是开发人员对门户的订阅,授权将是后端服务器所需的OAuth授权

此外,如果任何用户需要访问api管理url,则用户需要在查询字符串中传递订阅密钥,并在授权标头中传递令牌(例如:桌面客户端)

有没有办法只使用JWT令牌而不使用订阅密钥来调用api managament url(但我仍然需要知道哪个开发人员/用户访问了该服务)。我期待的是单个令牌,可以用于向开发人员门户验证用户,也可以用于向后端api验证(通过转换到后端服务器令牌或任何其他方式)

谢谢

约翰

是的,你可以这么做(有点小技巧)。为此,您必须使用RESTAPI,特别是这个。对我来说,编辑现有API不起作用(他们的密钥仍然存在),但当我创建新API时,密钥不存在:

我不得不把我所有的东西都弄模糊了,很抱歉。为此,您需要发出以下查询:

路径

PUT https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ApiManagement/service/{serviceName}/apis/{apiId}?api-version=2016-07-07&import=true&path={APIpostfix}
标题

Authorization = "Bearer TOKEN_GOES_HERE" ## Space after 'Bearer' is mandatory  
Content-Type = "application/vnd.swagger.link+json" ## Look for the proper "Content-Type" on the page I've linked. This is the example to import API definition directly from "swagger.json" generated by your running api.
正文:

{
“名称”:“名称”,
“说明”:“说明”,

“链接”:http://url.to/your/swagger.json“,###APIM中的订阅密钥与用户和产品绑定,因此,如果您将(或创建新的)产品更改为不需要订阅(创建时或产品设置中提供的选项),则无需usbscription密钥即可调用此类产品中包含的任何API


缺点是,APIM会将所有此类调用视为匿名调用,并在分析中显示为匿名调用。

我不清楚您告诉我要做什么。但是,这样做如何识别哪个用户调用了api管理服务?我需要去掉SUBSCRIBTION密钥。但我仍然需要知道用户的统计信息(即,哪些用户正在调用哪些应用程序)。正如我在最初的帖子中所提到的——“我期待的是单个令牌,可用于向开发人员门户验证用户,也可用于向后端api验证(通过转换到后端服务器令牌或任何其他方式)”所以使用JWT,有什么问题吗?但是JWT将向后端api验证用户。但是我如何知道哪个用户使用api管理服务url而没有订阅密钥?我问的原因是我不希望用户使用两个身份验证密钥-订阅密钥和JWT令牌来访问api管理服务我能想出一种方法来使用JWT调用api管理服务吗?我仍然需要从api管理中了解用户的统计信息(如事件中心日志等)答案是肯定的,你可以这样做,但那是完全不同的问题嘿@John,你找到解决这个问题的方法了吗?没有。我们最终使用了两个头-订阅密钥和oauth令牌
{
    "name": "Name",
    "description": "Desc",
    "link": "http://url.to/your/swagger.json", ## <<only needed if you import directly from running API
    "serviceUrl": "https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ApiManagement/service/{serviceName}/apis/{apiId}/backends/{APIpostfix}", ## << declare your API Management backend
    "protocols": [
        "https"
    ],
    "authenticationSettings": {
        "oAuth2": null,
        "openid": null
    },
    "subscriptionKeyParameterNames": { ## << Magic happens here
        "header": null,
        "query": null
    }
}