我有一个使用 .NET Framework 4.7.2 构建的旧版 ASP.NET Web API 应用程序,目前尚未为其实现身份验证。如何为此应用程序应用 Microsoft Identity Platform 身份验证。我希望此身份验证/授权仅应用于一个端点,而不是应用程序的其余部分。
我创建了另一个 .NET 6.0 ASP.NET Core Web API 应用程序,其
Startup.ConfigureServices
方法中包含以下语句。
JwtSecurityTokenHandler.DefaultMapInboundClaims = false;
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApi(_configuration);
services.Configure<JwtBearerOptions>(JwtBearerDefaults.AuthenticationScheme, options =>
{
// The claim in the Jwt token where App roles are available.
options.TokenValidationParameters.RoleClaimType = "roles";
});
这个单独的 API 工作正常。现在,我尝试将经过身份验证的 API 请求从这个新应用程序发送到旧应用程序,并让旧端点担心身份验证。有人可以指导我正确的方法吗?到目前为止,我发现的最接近的问题是this、this和this,但它们没有回答我的问题。
我通过阅读原始问题中的所有链接问题、阅读本文并尝试不同的代码片段,找到了问题的解决方案。下面列出了我最终的工作更改。
创业班:
我为 OWIN 创建了这个
Startup
类。
public class Startup
{
public void Configuration(IAppBuilder app)
{
var authority = "{authority-URL}";
var configurationManager = new ConfigurationManager<OpenIdConnectConfiguration>(
authority + "/.well-known/openid-configuration",
new OpenIdConnectConfigurationRetriever(),
new HttpDocumentRetriever());
var discoveryDocument = Task.Run(() => configurationManager.GetConfigurationAsync()).GetAwaiter().GetResult();
app.UseJwtBearerAuthentication(
new JwtBearerAuthenticationOptions
{
AuthenticationMode = Microsoft.Owin.Security.AuthenticationMode.Active,
TokenValidationParameters = new TokenValidationParameters()
{
ValidAudience = "{app-audience}",
ValidIssuer = "{issuer-URL}",
IssuerSigningKeyResolver = (token, securityToken, identifier, parameters) =>
{
return discoveryDocument.SigningKeys;
},
ValidateIssuerSigningKey = true,
ValidateIssuer = true,
ValidateAudience = false,
}
});
}
}
Web.config:
我在
<appSettings>
部分添加了以下行:
<add key="owin:AutomaticAppStartup" value="true" />
授权属性:
我在想要应用身份验证的端点上添加了
[Authorize]
属性。
我在 StackOverflow 上读到的大多数答案都包含以下语句,但这些语句对我来说从来没有用,因为我不知道应用程序的密钥,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("jwt_signing_secret_key"))
但是这篇文章有一个替代示例,其中
IssuerSigningKeyResolver
是我的最后一块拼图。