观众是无效的错误

时间:2017-07-04 14:57:25

标签: jwt identityserver4

我有3个项目1- Javascript SPA 2- Web API项目,3-带有EF Core的IdentityServer

我开始调试API和Identity Server并成功获取jwt令牌但是,当我尝试从具有Authorize Attribute的API方法获取值时,我收到错误:

WWW-Authenticate →Bearer error="invalid_token", error_description="The audience is invalid"

我在auth选项中找不到任何关于观众的属性。这是我在API项目中的配置

app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions
        {
            ApiSecret="secret",
            Authority = "http://localhost:5000",
            ApiName="fso.Api",
            RequireHttpsMetadata = false,
        });

我的身份

中的Config.cs文件
 public class Config
{        
    public static IEnumerable<ApiResource> GetApiResources()
    {
        return new List<ApiResource>
        {                
            new ApiResource()
            {
                Name = "fso.Api",                    
                DisplayName = "feasion API",
                Scopes =
                {
                    new Scope("api1"),
                    new Scope(StandardScopes.OfflineAccess)
                },
                UserClaims =
                {
                    JwtClaimTypes.Subject,
                    JwtClaimTypes.EmailVerified,
                    JwtClaimTypes.Email,
                    JwtClaimTypes.Name, 
                    JwtClaimTypes.FamilyName,
                    JwtClaimTypes.PhoneNumber,
                    JwtClaimTypes.PhoneNumberVerified,
                    JwtClaimTypes.PreferredUserName,
                    JwtClaimTypes.Profile, 
                    JwtClaimTypes.Picture, 
                    JwtClaimTypes.Locale, 
                    JwtClaimTypes.IdentityProvider,
                    JwtClaimTypes.BirthDate, 
                    JwtClaimTypes.AuthenticationTime
                }
            }
        };
    }
    public static List<IdentityResource> GetIdentityResources()
    {
        return new List<IdentityResource>
        {
            new IdentityResources.OpenId(),
            new IdentityResources.Email(),
            new IdentityResources.Profile(),
        };
    }

    // client want to access resources (aka scopes)
    public static IEnumerable<Client> GetClients()
    {
        return new List<Client>
        {
            new Client
            {
                ClientId = "fso.api",
                AllowOfflineAccess=true,
                ClientSecrets =
                {
                    new Secret("secret".Sha256())
                },
                AllowedGrantTypes = GrantTypes.ResourceOwnerPassword,                    
                AllowedScopes =
                {                       
                   StandardScopes.OfflineAccess,                    
                   "api1"
                }
            }
        };
    }
}

2 个答案:

答案 0 :(得分:10)

请参阅here了解此声明的内容:

  

aud(观众)声明标识了JWT的目标收件人。每个打算处理JWT的委托人都必须在受众索赔中标明自己的价值。如果处理索赔的委托人在提出索赔时没有在审计索赔中标明自己的价值,那么JWT必须被拒绝....

因此,当您的API中的中间件验证JWT时,您的API名称必须存在于JWT的声明中。您可以使用jwt.io来查看您的令牌,这有助于理解它。

为了让IdentityServer将您的API名称添加到aud声明中,您的客户端代码(尝试从API获取资源,因此需要访问令牌)应该从您的API请求范围。例如像这样(来自MVC客户端):

app.UseOpenIdConnectAuthentication(new OpenIdConnectOptions
{
    Authority = Configuration["IdpAuthorityAddress"],
    ClientId = "my_web_ui_id",
    Scope = { "api1" },

    //other properties removed...
});

答案 1 :(得分:5)

为避免错误,应在4个地方持续添加受众

1.在我的(例如MVC)客户端中作为自定义范围。
2.在API应用程序中作为ApiName
3.在IdentityServer客户端配置为AllowedScope
4.在API资源配置中作为ApiResource

有关详细信息,请参阅https://github.com/IdentityServer/IdentityServer4/wiki/Troubleshooting--Bearer-error-The-audience-is-invalid