如何使用应用服务对Azure功能应用进行身份验证/授权?

时间:2017-11-07 07:54:25

标签: azure azure-active-directory azure-mobile-services

我有一个Azure 应用服务以及功能应用(我目前正在学习Azure,如果还有其他方法可以实现我想要的,我愿意接受建议)。应用服务包含一个简单的表格,我想与应用程序同步(已经正在运行),我想实现一个带有blob存储输入绑定或定时器触发器的功能,它可以填充简易表格。

由于似乎没有针对简单表的输出绑定,我遵循this answer并使用MobileServiceClient实现了访问。

MobileServiceClient client = new MobileServiceClient("https://my-app.azurewebsites.net");
var table = client.GetTable<MyTableClass>();
await table.InsertAsync(myObject);

只要表是可公开写的,这就可以工作,当然,当它是非同类的可读时它不起作用,但只能为经过身份验证的用户写入。为了验证我的功能,我创建了一个Azure Active Directory并为该AD中的应用程序创建了一个API密钥,然后我尝试通过

验证MobileServiceClient
await client.LoginAsync(MobileServiceAuthenticationProvider.WindowsAzureActiveDirectory, 
                        new JObject {{"access_token", "<my API key>"}});

但这没有成功。我总是收到错误

  

请求无法完成。 (未授权)。

显然这没有用(使用API​​密钥的方式实际上只是在黑暗中拍摄),但我不知道如何从我的功能应用程序完成身份验证。我知道当我在应用程序中使用MobileServiceClient时,我可以将用户重定向到登录,但这显然不适用于函数。

如何使用现有应用服务验证我的功能,以便写入匿名无法写入的表格?

2 个答案:

答案 0 :(得分:0)

app service 无法通过API密钥进行简单访问,但访问应用服务需要通过Active Directory进行完整身份验证。为此,可以使用 ADAL Active Directory Access Library)。

AuthenticationContext

ADAL定义AuthenticationContext类,它是使用Active Directory进行身份验证的帮助程序。首先创建一个新的AuthenticationContext

var authenticationContext = new AuthenticationContext("https://login.microsoftonline.com/<Directory ID>");

您可以通过访问Azure门户中的 Azure Active Directory 找到Directory ID,然后从 Azure Active Directory菜单中打开属性 。在属性菜单中,有一个包含Directory ID

的文本框

使用Azure Active Directory进行身份验证

您现在可以使用

进行身份验证
var authenticationResult = await authenticationContext.AcquireTokenAsync(
      "https://batch.core.windows.net/", 
      new ClientCredential("<app ID>", "<app secret>"));

我假设已经 已注册的应用。要获取应用ID ,请访问 Azure Active Directory 应用注册&lt;您的应用&gt; ,您可以找到应用程序ID (也在属性下)。

接下来,您必须为应用创建密钥。因此,请访问 Azure Active Directory 应用程序注册&lt;您的应用程序&gt; 密钥。您可以在那里创建密钥,只需输入密钥名称和到期日期,然后单击“保存”。保存后将显示密钥。 (小心:之后无法恢复密钥。将其保存在某处。)

MobileServiceClient

最后一步是创建MobileServiceClient。由于UI登录不可用,我们必须手动创建登录用户(请参阅here)。

MobileServiceClient client = new MobileServiceClient("https://my-app.azurewebsites.net");
client.CurrentUser = new MobileServiceUser("Foo:123456789");
client.CurrentUser.MobileServiceAuthenticationToken = authenticationResult.AccessToken;

现在MobileServiceClient已经过身份验证,可以使用了。

进一步阅读

https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-protocols-oauth-service-to-service

https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-authentication-scenarios#web-application-to-web-api

https://docs.microsoft.com/en-us/dotnet/api/microsoft.identitymodel.clients.activedirectory.authenticationcontext?view=azure-dotnet

https://docs.microsoft.com/en-us/azure/batch/batch-aad-auth

答案 1 :(得分:0)

您使用托管服务标识来验证您的应用服务功能。

  

您的应用程序可以与其他Azure服务进行通信   使用托管的Azure Active Directory标识。

您可以在此处查看如何启用和使用托管身份:

https://docs.microsoft.com/en-us/azure/app-service/app-service-managed-service-identity

希望这有帮助!