当前位置: 首页 > 知识库问答 >
问题:

使用Azure AD承载令牌对API应用程序进行Web应用程序身份验证

丌官盛
2023-03-14

我正在尝试访问一个我在Azure上托管并用Azure AD保护的API应用程序。

对于API应用程序,我已经设置了App Service Authentication=Azure Active Directory“Express”管理模式。

在“Classic”门户中,我在AD下创建了几个应用程序。一个用于API应用程序,另一个用于Web应用程序。对于Web应用程序,我在API应用程序的“对其他应用程序的权限”下添加了一个条目(尽管我不确定是否需要这个条目,因为API应用程序的“访问应用程序所需的用户分配”是关闭的)。我还为Web应用程序生成了一个密钥。

我可以使用以下代码成功获得一个承载令牌:

private static string aadInstance = ConfigurationManager.AppSettings["ida:AADInstance"];
private static string tenant = ConfigurationManager.AppSettings["ida:Tenant"];
private static string clientId = ConfigurationManager.AppSettings["ida:ClientId"];
private static string appKey = ConfigurationManager.AppSettings["ida:AppKey"];

static string authority = String.Format(CultureInfo.InvariantCulture, aadInstance, tenant);

private static string ApiId = ConfigurationManager.AppSettings["ApiId"];

private static AuthenticationContext authContext = new AuthenticationContext(authority);
private static ClientCredential clientCredential = new ClientCredential(clientId, appKey);

...

AuthenticationResult result = null;
int retryCount = 0;
bool retry = false;

do
{
    retry = false;
    try
    {
        // ADAL includes an in memory cache, so this call will only send a message to the server if the cached token is expired.
        result = await authContext.AcquireTokenAsync(ApiId, clientCredential);
    }
    catch (AdalException ex)
    {
        if (ex.ErrorCode == "temporarily_unavailable")
        {
            retry = true;
            retryCount++;
            Thread.Sleep(3000);
        }
    }

} while ((retry == true) && (retryCount < 3));

if (result == null)
    return Request.CreateResponse(HttpStatusCode.InternalServerError, "Could not authenticate against API.");

但是当我将承载令牌与从Web应用程序到API应用程序的请求一起使用时,我总是得到一个401未经授权的响应:

StatusCode: 401, ReasonPhrase: 'Unauthorized', Version: 1.1, Content: System.Net.Http.StreamContent, Headers:
{
  Date: Wed, 13 Jul 2016 08:43:09 GMT
  Server: Microsoft-IIS/8.0
  WWW-Authenticate: Bearer realm="MY-API-APP-ID-IS-HERE"
  X-Powered-By: ASP.NET
  Content-Length: 58
  Content-Type: text/html
}
var apiUri = new Uri(ConfigurationManager.AppSettings["ApiUrl"] + "/api/MethodImCalling");
var client = new RestClient(apiUri.GetLeftPart(UriPartial.Authority));
var request = new RestRequest(apiUri, Method.GET);
request.AddHeader("Authorization", "Bearer " + result.AccessToken);
request.AddParameter("something", somevalue);
var response = client.Execute(request);

if (response.StatusCode != HttpStatusCode.OK)
    return Request.CreateResponse(response.StatusCode); // Relay non-successful response

共有1个答案

穆丁雨
2023-03-14

获得401响应的原因是您只授予了应用程序委托权限,但您正在使用需要应用程序权限的客户端凭据流。

您可以更改代码以使用授权代码流,也可以将应用程序权限从web应用程序授予web API。

要使用授权代码流,您需要将代码更改为使用AcquireTokenByAuthorizationCodeAsync。

 类似资料:
  • 现在我想知道如何集成刷新令牌。如何确保用户只能使用已颁发给该设备的有效刷新令牌获得新的访问令牌?或者,我是否使事情过于复杂,并分配一个刷新令牌,可以在alle设备上使用,这将是一个诀窍? 更新:我已经研究了doorkeeper gem,它支持密码授予流。但是doorkeeper处理令牌的方式是,它将每个生成的访问令牌与相应的刷新令牌存储在数据库中。当令牌被撤消或刷新时,旧的访问令牌将失效--随着时

  • 我在决定如何为一个RESTful API实现身份验证时遇到了一些麻烦,该API既可供web应用程序使用,也可供移动应用程序使用。 首先,我想研究HTTPS上的HTTP基本身份验证作为一种选择。对于移动应用程序来说,用户名和密码可以安全地存储在操作系统钥匙链中,并且在传输过程中无法被拦截,因为请求是通过HTTPS发出的。对于API来说,它也很优雅,因为它将是完全无状态的。问题在于web应用程序。将无

  • 我已经设置了一个广告2016安装。现在打算使用它对web应用程序(java)进行身份验证。我有一段用于测试身份验证的代码,并有一些观察。 现在我在以下场景中测试了用户/密码组合- //第一个组合,user1存在于AD中并且密码正确(测试经过身份验证的绑定)。字符串userid=“user1@domain.com”,password=“user1password”;预期:身份验证成功。实际:身份验证

  • 我需要在我们的Web应用程序中使用LDAP/AD服务器实现SSO身份验证和验证用户。Web应用程序是使用Spring(Java)/Hibernate制作的,应用程序服务器是UAT中的Jboss和生产中的Webphere。 我正在寻找一些好的简单的解决方案,可以帮助我实现它,从几个朋友那里听说华夫饼是一个很好的解决方案,但是在网上搜索并尝试了几天之后,我不确定我是否朝着正确的方向前进。我在这方面很幼

  • 问题内容: 简短的问题: 我在.NET中有一个Web API服务,而一个站点仅由HTML和AngularJS组成。 如何仅对我的网站授权给我的服务? 我正在寻找一个似乎很常见但不是常见问题的安全答案。在最近的日子里,我读了很多答案,想法和各种各样的东西,但是找不到解决方案。 假设我有一个来自MS的Web Api服务(最新的)。所以我必须要消耗它的应用程序。让我们定义两个方案。 方案1: 在同一个I

  • 我试图理解饼干之间的区别;特别是.NET核心上下文中的JWT。我花了几天时间来研究这件事。 我的研究正在告诉我,Cookie和承载是可供选择的身份验证机制,它们都被表示为JWT。 说.NET核心web应用程序应该使用Cookie,.NET核心web API应该使用承载,这样说公平吗?我这样问的原因是,我看到的每个Bearer示例(在.NET核心上下文中)都使用Web API,我看到的每个Cooki