我正在尝试使用Azure Active Directory V2在我的AspNetCore 2.1应用程序中设置Swagger,但似乎无法正确完成。我能够配置安装程序,以便迅速地提示,重定向并成功验证我的客户端/用户,但是将不记名令牌传递到服务器时会导致错误Bearer error="invalid_token", error_description="The signature is invalid"
。我已经使用该项目创建了一个GitHub存储库,以尝试使用其所有配置(https://github.com/alucard112/auth-problem)
通过将资源设置为AAD应用程序的客户端ID,我设法使V1端点正常工作,这导致JWT令牌将“ aud”设置为应用程序客户端ID。在V2端点中,“ aud”被设置为我认为是Graph API资源“ 00000003-0000-0000-c000-000000000000”。我不确定这是我目前的问题,尽管不确定100%。 V2端点似乎没有像V1那样定义受众的方法,除非我这边当然有一些疏忽。
我的启动文件的结构如下:
身份验证设置如下:
services.AddAuthentication(AzureADDefaults.BearerAuthenticationScheme)
.AddAzureADBearer(options => Configuration.Bind("AzureAd", options));
services.Configure<JwtBearerOptions>(AzureADDefaults.JwtBearerAuthenticationScheme, options =>
{
options.Authority = $"https://login.microsoftonline.com/{tenantId}";
options.TokenValidationParameters = new TokenValidationParameters
{
// In multi-tenant apps you should disable issuer validation:
ValidateIssuer = false,
// In case you want to allow only specific tenants,
// you can set the ValidIssuers property to a list of valid issuer ids
// or specify a delegate for the IssuerValidator property, e.g.
// IssuerValidator = (issuer, token, parameters) => {}
// the validator should return the issuer string
// if it is valid and throw an exception if not
};
});
和摇摇欲坠设置如下:
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new Info
{
Title = "Protected Api",
});
c.OperationFilter<SecurityRequirementsOperationFilter>();
//IMATE - StevensW
// Define the OAuth2.0 scheme that's in use (i.e. Implicit Flow)
c.AddSecurityDefinition("oauth2", new OAuth2Scheme
{
Type = "oauth2",
Flow = "implicit",
AuthorizationUrl = $"https://login.microsoftonline.com/{tenantId}/oauth2/v2.0/authorize",
TokenUrl = $"https://login.microsoftonline.com/common/{tenantId}/v2.0/token",
Scopes = new Dictionary<string, string>
{
{ "openid", "Unsure" },
{ "profile", "Also Unsure" }
}
});
});
app.UseSwagger();
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
c.OAuthClientId(Configuration.GetValue<string>("AzureAd:ClientId"));
c.OAuthAppName("Protected API");
//c.OAuthUseBasicAuthenticationWithAccessCodeGrant();
//c.OAuthClientSecret(Configuration.GetValue<string>("AzureAd:ClientId"));
});
我希望将swagger UI配置为使用AAD的V2端点,并允许多租户登录,以允许成功执行经过身份验证的API调用。任何帮助或指示将不胜感激。
答案 0 :(得分:0)
我最终解决了我遇到的问题。通过this post进行的工作有助于我理解自己的错误。
第一个错误是我实际的AAD应用注册。我没有在“公开API”下为应用程序设置范围。因为它们在V2中已弃用资源属性,所以设置资源的方式是创建格式为api“ // {应用程序ID} / {scope_name}的范围。进行此更改后,现在正确配置了AAD应用程序。
之后,我需要在启动文件中添加一个附加部分:
return services.Configure<JwtBearerOptions>(AzureADDefaults.JwtBearerAuthenticationScheme, options =>
{
// This is an Azure AD v2.0 Web API
options.Authority += "/v2.0";
// The valid audiences are both the Client ID (options.Audience) and api://{ClientID}
options.TokenValidationParameters.ValidAudiences = new string[] { options.Audience, $"api://{options.Audience}" };
options.TokenValidationParameters.ValidateIssuer = false;
});
注意:上面的链接提供了一种替代解决方案,如果有人感兴趣的话,可以关闭发行人的验证。
我的AppSettings文件也得到了简化,只需定义Instance,TenantId和ClientId。
然后,从一个宽泛的角度来看,我只需要在安全定义中添加一个与我在AAD应用程序中创建的范围相匹配的附加范围即可。
c.AddSecurityDefinition("oauth2", new OAuth2Scheme
{
Type = "oauth2",
Flow = "implicit",
AuthorizationUrl = "https://login.microsoftonline.com/common/oauth2/v2.0/authorize",
TokenUrl = "https://login.microsoftonline.com/common/oauth2/v2.0/token",
Scopes = new Dictionary<string, string>
{
{ "openid", "Sign In Permissions" },
{ "profile", "User Profile Permissions" },
{ $"api://{clientId}/access_as_user", "Application API Permissions" }
}
});
这些更改之后,我的应用程序现在可以按预期运行。
答案 1 :(得分:0)
对于v2端点,将AAD清单中的accessTokenAcceptedVersion从null更新为2。