在 JwtBearerOptions 中为 Azure Active Directory 身份验证指定客户端机密
Posted
技术标签:
【中文标题】在 JwtBearerOptions 中为 Azure Active Directory 身份验证指定客户端机密【英文标题】:Specifying Client secrets in JwtBearerOptions for Azure Active Directory authentication 【发布时间】:2018-04-04 11:33:37 【问题描述】:如果我在 Visual Studio 2017 中创建一个新的 ASP.NET Core MVC 应用程序,我可以在 AzureAdServiceCollectionExtensions
中添加一行客户端密码:
public void Configure(string name, OpenIdConnectOptions options)
options.ClientId = _azureOptions.ClientId;
// Add this line below
options.ClientSecret = _azureOptions.ClientSecret;
options.Authority = $"_azureOptions.Instance_azureOptions.TenantId";
options.UseTokenLifetime = true;
options.CallbackPath = _azureOptions.CallbackPath;
options.RequireHttpsMetadata = false;
配置 POCO 已经连接好,可以从配置文件中获取它。
另一方面,在 Web API 项目中,身份验证使用 JWT Tokens,而 Visual Studio 生成的代码则不同:
public void Configure(string name, JwtBearerOptions options)
options.Audience = _azureOptions.ClientId;
options.Authority = $"_azureOptions.Instance_azureOptions.TenantId";
我不确定在 JwtBearOptions
中的哪个位置放置客户端密码。
【问题讨论】:
有效吗?你试过了吗? 为什么不在configure方法中? 【参考方案1】:您实际上并未在选项中指定客户端密码。它在您使用对称密钥签署令牌时使用。
public void Configure(string name, JwtBearerOptions options)
options.Audience = _azureOptions.ClientId;
options.Authority = $"_azureOptions.Instance_azureOptions.TenantId";
var secretKey = "mysupersecret_secretkey!123";
var signingKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(secretKey));
options.TokenValidationParameters.IssuerSigningKey = signingKey;
查看这些链接:
http://www.blinkingcaret.com/2017/09/06/secure-web-api-in-asp-net-core/ https://stormpath.com/blog/token-authentication-asp-net-core【讨论】:
【参考方案2】:OIDC 处理程序允许您指定客户端密码,因为如果您愿意,它可以自行获取访问令牌。
JWT 处理程序不提供此功能。它的工作是验证 JSON Web Tokens 并且什么也不做。
如果您想获得一个委托访问令牌以作为用户调用其他一些 API,您需要自己通过 ADAL/MSAL 获得访问令牌。
您可以为此使用OnTokenValidated
回调:
services.AddAuthentication()
.AddJwtBearer(o =>
o.Events = new JwtBearerEvents()
OnTokenValidated = async context =>
;
);
【讨论】:
以上是关于在 JwtBearerOptions 中为 Azure Active Directory 身份验证指定客户端机密的主要内容,如果未能解决你的问题,请参考以下文章
在 Azure Web 应用程序中为 Web API 启用 CORS