Asp.Net-Jwt承载身份验证:签名无效

rdrgkggo  于 12个月前  发布在  .NET
关注(0)|答案(1)|浏览(151)

我从AzureAD为我的应用获取access_token和id_token,该应用使用OAuth2和隐式流。这是我获取令牌的示例URL:
第一个月
范围是openid https://grap.microsoft.com/user.read
response_typeid_token+token
我也有一个ASP.NET后端,我想安全。所以我使用Authorize属性为我的控制器,并发送一个令牌在头部如下:Authentication : "Bearer THE_TOKEN"
我在Startup.cs中的配置看起来像这样:

app.UseJwtBearerAuthentication(new JwtBearerOptions
{
    Authority = string.Format("https://login.microsoftonline.com/{0}/v2.0/",
            "d67853c3-db96-4dac-a37b-f2bfb12b42d1"),
    Audience = "8422b3fb-5612-4fdd-a90f-707d7218de57"
});

字符串
从我所读到的,访问令牌应该用于此,id_token不应该离开前端。但在我的情况下,后端的身份验证只能使用id令牌。access_token不能签名Bearer error="invalid_token", error_description="The signature is invalid"
在jwt.io上查看 access_token,我看到代币有不同的受众和发行者。

"aud": "https://graph.microsoft.com",
"iss": "https://sts.windows.net/d67853c3-db96-4dac-a37b-f2bfb12b42d1/",


而ID令牌具有以下特性:

"aud": "my_client_id",
"iss": "https://login.microsoftonline.com/my_tenant_id/v2.0",


所以在我看来,access_token是为Graph API发布的。如果有人能告诉我,我做错了什么,或者我如何解决我的问题,我会很高兴。

编辑:当我使用scope openid profile时,它按预期工作。但由于Azure的更改,此scope不再有效,Microsoft指示我使用上述scope。

xmd2e60i

xmd2e60i1#

正如您提到的,您请求的访问令牌是用于Microsoft Graph的。并且id_token仅用于客户端验证用户,而不是用于资源服务器。
要使用Azure AD V2.0端点保护Web API,我们可以获取Web API的访问令牌,如下面的请求:

https://login.microsoftonline.com/common/oauth2/v2.0/authorize?response_type=token&client_id={client_id}&scope=api://{client_id}/access_as_user&redirect_uri={redirect_uri}

字符串
下面是通过Azure AD V2.0端点保护Web API的代码:

public void ConfigureAuth(IAppBuilder app)
{
    System.Diagnostics.Trace.TraceWarning("Hello");
    var tvps = new TokenValidationParameters
    {
        // The web app and the service are sharing the same clientId
        ValidAudience = clientId,
        ValidateIssuer = false,
    };

    // NOTE: The usual WindowsAzureActiveDirectoryBearerAuthenticaitonMiddleware uses a
    // metadata endpoint which is not supported by the v2.0 endpoint.  Instead, this 
    // OpenIdConenctCachingSecurityTokenProvider can be used to fetch & use the OpenIdConnect
    // metadata document.

    app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions
    {
        AccessTokenFormat = new JwtFormat(tvps, new OpenIdConnectCachingSecurityTokenProvider("https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration")),
    });
}


}
有关通过Azure AD V2.0端点保护Web API的更多详细信息,您可以参考下面的文档:
Calling a web API from a .NET web app

相关问题