asp.net 核心应用程序中的 AzureAD 和 AzureADBearer,给出无效签名错误

Posted

技术标签:

【中文标题】asp.net 核心应用程序中的 AzureAD 和 AzureADBearer,给出无效签名错误【英文标题】:AzureAD and AzureADBearer in asp.net core app, gives invalid signature error 【发布时间】:2019-10-21 06:22:17 【问题描述】:

我在 asp.net core 2 应用程序中使用 AzureAD。我想同时使用 cookie 和承载身份验证。我在启动文件中有以下代码:

public void ConfigureServices(IServiceCollection services)

    services.Configure<CookiePolicyOptions>(options =>
    
        // This lambda determines whether user consent for non-essential cookies is needed for a given request.
        //options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    );

    services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
            .AddAzureAD(options => Configuration.Bind("AzureAd", options))
            .AddAzureADBearer(options => Configuration.Bind("AzureAdClient", options));


    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"), sqlServerOptions => sqlServerOptions.CommandTimeout(120)));


    //services.AddMvc();
    services.AddMvc(options =>
    
        var policy = new AuthorizationPolicyBuilder()
                        .RequireAuthenticatedUser()
                        .Build();
        //options.Filters.Add(new AuthorizeFilter(policy));
    )
    .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);


我已将授权属性添加为:

[Authorize(AuthenticationSchemes = "AzureADBearer")]

现在,当我从邮递员那里打到时,我可以获得不记名令牌,但是当我使用该令牌访问此 API 时,我收到签名无效错误:

WWW-Authenticate →Bearer error="invalid_token", error_description="签名无效"

有什么想法吗?

【问题讨论】:

授权属性不应该是Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)] 这里有一个示例供您参考。 github.com/Azure-Samples/… 你的AzureAdClient 配置是什么?验证令牌的配置是否正确? @NanYu,此配置适用于在 Azure AD 上注册的新客户端应用程序。我已将此新应用程序添加为 API 应用程序中的客户端。所以我在 Azure AD 上有两个应用程序,一个用于 WebAPI,一个用于客户端。 【参考方案1】:

试试下面的方法,应该可以的。

services.AddAuthentication(sharedOptions =>

    sharedOptions.DefaultChallengeScheme = AzureADDefaults.AuthenticationScheme;
    sharedOptions.DefaultAuthenticateScheme = AzureADDefaults.AuthenticationScheme;
)
.AddAzureAD(options => Configuration.Bind("AzureAd", options))
.AddAzureADBearer(options => Configuration.Bind("AzureAd", options));

在控制器应用程序中,您可以像这样设置架构:

[HttpGet]
[Authorize(AuthenticationSchemes = "AzureADBearer")]
public IEnumerable<string> Get()

    return new string[]  "value1", "value2" ;

希望对你有帮助。

【讨论】:

我在发布这个问题之前尝试过这个。我没有工作。同样的问题。【参考方案2】:

好吧,我解决了这个问题。现在在 asp.net core web + API 项目中,我只使用 API 特定的 AzureAD 设置。对于 Postman 和移动应用程序,我创建了一个新的应用程序注册,并为早期应用程序注册(API 应用程序注册)添加了范围,这些应用程序具有用户模拟和作为用户权限的访问权限。

【讨论】:

以上是关于asp.net 核心应用程序中的 AzureAD 和 AzureADBearer,给出无效签名错误的主要内容,如果未能解决你的问题,请参考以下文章

Azure AD 与 ASP.NET Core MVC 中的标识

.net 核心 API 中的混合身份验证

使用 JWT 令牌保护 asp.net 核心 Web api 时如何从 Azure AD 获取用户

如何将 AzureAD 和 AzureADBearer 添加到 asp.net core 2.2 web api

使用 Azure AD 的 Asp.net core mvc 基于角色的授权

ASP.net Core 2.0 AzureAd Bearer JWT-Token Auth 在验证签名时不会失败