【发布时间】:2021-04-27 10:29:23
【问题描述】:
环境:Azure、Azure AD 免费许可证;
我构建了一个 ASP.NET Core 3.0 Web API 并托管在 Azure 应用服务中。它设置为OAuth Implicit Grant flow,其中令牌在授权标头中用作bearer。到目前为止一切正常;从令牌生成到授权再到 Web API 的身份验证。
我已经设置为:
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(AzureADDefaults.BearerAuthenticationScheme)
.AddAzureADBearer(options => {
var readAzureAdFromEnvironment = Environment.GetEnvironmentVariable("READ_AZUREAD_FROM_ENVIRONMENT");
if (!string.IsNullOrEmpty(readAzureAdFromEnvironment) && readAzureAdFromEnvironment.ToUpper().Equals("TRUE"))
{
var INSTANCE = Environment.GetEnvironmentVariable("INSTANCE");
var DOMAIN = Environment.GetEnvironmentVariable("DOMAIN");
var TENANTID = Environment.GetEnvironmentVariable("TENANTID");
var CLIENTID = Environment.GetEnvironmentVariable("CLIENTID");
options.Instance = INSTANCE;
options.Domain = DOMAIN;
options.ClientId = CLIENTID;
options.TenantId = TENANTID;
}
else
{
Configuration.Bind("AzureAd", options);
}
});
services.Configure<Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerOptions>(AzureADDefaults.JwtBearerAuthenticationScheme, options =>
{
options.Events = new Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerEvents
{
OnTokenValidated = OnTokenValidated
};
options.RequireHttpsMetadata = false;
options.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters()
{
ValidateIssuer = false,
ValidateAudience = false
};
});
services.AddControllers()
.AddFluentValidation(s =>
{
s.RegisterValidatorsFromAssemblyContaining<Startup>();
s.RunDefaultMvcValidationAfterFluentValidationExecutes = false;
});
services.AddLogging(loggingBuilder =>
{
loggingBuilder.AddConsole();
loggingBuilder.AddDebug();
loggingBuilder.AddAzureWebAppDiagnostics();
});
services.AddApiVersioning(x =>
{
x.DefaultApiVersion = new ApiVersion(5, 0);
x.AssumeDefaultVersionWhenUnspecified = true;
x.ReportApiVersions = true;
x.ApiVersionReader = new HeaderApiVersionReader("x-api-version");
});
}
我了解到 ASP.NET Core 的默认 OAuth 设置也是
Implicit Grant type.
但是,考虑到消费者需要整合的上下文 使用自动化流程,手动输入似乎不可行 凭证并在每次令牌过期时获取一个新令牌。
我也学到了这两者;隐式和 Auth-Code 需要
access_token作为其最后阶段。
到目前为止我做了什么:
-
我能够通过使用带有
client secret的oauth2/v2.0/token端点生成access_token,并在授权标头中使用bearer的令牌并且它有效。但是,我注意到我无法获取登录的用户 ID。我使用了以下内容:client_id:“xxxxxxxxxxxxxxxxxxxxxxxx” grant_type:“client_credentials” client_secret:“xxxxxxxxxxxxxxx” 范围:“api://xxxxxxxxxxxxxx/.default”
做了一些研究,发现Authorization Code Grant flow 非常适合这种情况,因为它可以生成refresh token,并且可以在令牌过期而不提示用户凭据的情况下使用。
要从隐式更改为Auth-Code Grant 我该怎么办?我有几个问题希望有人可以帮助我
- 是否涉及 Azure Active Directory 中的代码更改或配置更改?
- 如何配置
Refresh_Token?这是否涉及 Azure Active Directory 中的代码更改或配置更改? -
Azure AD Free licence是否有任何限制?
如果能给出示例代码,不胜感激。
【问题讨论】:
标签: c# asp.net-core oauth-2.0 azure-active-directory azure-web-app-service