Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Azure active directory 使用AAD令牌保护.Net Core 3 Web API_Azure Active Directory_Asp.net Core Webapi - Fatal编程技术网

Azure active directory 使用AAD令牌保护.Net Core 3 Web API

Azure active directory 使用AAD令牌保护.Net Core 3 Web API,azure-active-directory,asp.net-core-webapi,Azure Active Directory,Asp.net Core Webapi,由于一些技术限制,我们在用户登录时进行用户名/密码AAD身份验证 用户将在自定义登录页面和应用程序调用中输入用户名和密码 我计划使用返回的令牌调用另一个Web API应用程序(也连接到同一个AAD)。在Web API应用程序中,我执行了以下操作: 在startupservices.AddAuthentication(AzureADDefaults.jwtbeareraauthenticationscheme)中添加了以下代码 在my appsettings.json文件中包括以下设置 “Azur

由于一些技术限制,我们在用户登录时进行用户名/密码AAD身份验证

用户将在自定义登录页面和应用程序调用中输入用户名和密码

我计划使用返回的令牌调用另一个Web API应用程序(也连接到同一个AAD)。在Web API应用程序中,我执行了以下操作:

  • 在startup
    services.AddAuthentication(AzureADDefaults.jwtbeareraauthenticationscheme)中添加了以下代码

  • 在my appsettings.json文件中包括以下设置
    “AzureAd”:{
    “实例”:https://login.microsoftonline.com/",
    “ClientId”:“,
    “租户”:”
    }

  • 使用[授权]保护我的web api
  • 然后,我使用Postman根据返回的令牌构造对Web API的调用。我包括
    授权:持票人
    。Web API返回

    承载错误=“无效令牌”,错误描述=“签名无效”

    我的问题是

  • Web API应用程序能否验证获取的用户名/密码令牌
  • 如果令牌可以在Web API应用程序中进行验证,那么既然我得到了上述错误,我该如何进行验证呢

  • 从您提供的文档中,您正在使用MSAL在Azure AD V2.0端点中使用资源所有者流获取访问令牌

    在验证Azure AD V2.0发布的访问令牌时,您应该将
    /V2.0
    添加到授权:

    services.Configure<JwtBearerOptions>(AzureADDefaults.JwtBearerAuthenticationScheme, options =>
    {
        // This is a Microsoft identity platform web API.
        options.Authority += "/v2.0";
    
        // The web API accepts as audiences both the Client ID (options.Audience) and api://{ClientID}.
        options.TokenValidationParameters.ValidAudiences = new []
        {
        options.Audience,
        $"api://{options.Audience}"
        };
    
    });
    
    services.Configure(AzureADDefaults.JwtBearerAuthenticationScheme,选项=>
    {
    //这是一个Microsoft identity platform web API。
    选项。权限+=“/v2.0”;
    //web API接受客户机ID(options.acquisition)和API://{ClientID}作为访问群体。
    options.TokenValidationParameters.Validudiences=new[]
    {
    选择,观众,
    $“api://{options.viewer}”
    };
    });
    
    我在我的网站上进行了测试,效果很好,您可以参考以下步骤:

    1.在azure ad中注册Webapi应用程序

    2.单击
    公开API
    添加范围
    ,例如
    网络阅读

    3.单击
    清单
    ,将
    accessTokenAcceptedVersion
    更改为
    2.0

    4.在visual studio webapi中
    配置服务

    services.AddAuthentication(AzureADDefaults.JwtBearerAuthenticationScheme).AddAzureADBearer(options => Configuration.Bind("AzureAd", options));
    services.Configure<JwtBearerOptions>(AzureADDefaults.JwtBearerAuthenticationScheme, 
    options =>
    {
        options.Authority += "/v2.0";
        options.TokenValidationParameters.ValidAudiences = new[]
        {
            options.Audience,
            $"api://{options.Audience}"
        };
    });
    

    希望它能帮助您。

    您能检查一下应用程序是否在AAD中分配了任何角色吗?谢谢您的回复。我添加了设置,现在我得到另一个错误“承载错误:无效令牌”。。但每次我打电话时,我都会重新生成访问令牌,但仍然会得到错误。@文浩,您新错误的详细错误消息是什么?初始错误消息是Bearer error=“invalid\u token”,错误描述=“签名无效”,更改后,错误消息是Bearer error=“invalid\u token”。我能看到全部错误吗?我计划浏览整个教程,看看我的设置和教程设置之间的区别()使用fiddler跟踪响应以找到内部错误消息。
    string[] scopes = new string[] { "api://1890e822-xxxxxxxxxxxxxxxx/webread" };