.net Core Api 使用 ADFS 2012 进行身份验证
.net Core Api authentication with ADFS 2012
我需要配置我的 .Net Core Web Api (.Net Framework) 以使用 ADFS 3.0 (2012) 来验证我们的移动客户端发送的 Bearer 令牌。
我能够从 ADFS 服务器生成 access_token,并在授权中传递它 header。
我的问题在 API:如何配置它来验证和自动授权用户?
我找了很多地方都没有找到确定的方法。
到目前为止我尝试了什么:
使用 IdentityServer4(失败,因为它使用 JWT 而 ADFS 不提供 OpenID
尝试过 UseOpenIdConnectAuthentication(在 IdentityServer4 找到示例)
自定义中间件
我不能使用其他方法,我需要支持 oAuth2。
那么,我该怎么做呢?
这是我最近的尝试:
var connectOptions = new OpenIdConnectOptions
{
AuthenticationScheme = "adfs",
SignInScheme = "idsrv.external", //IdentityServerConstants.ExternalCookieAuthenticationScheme,
SignOutScheme = "idsrv", //IdentityServerConstants.SignoutScheme,
AutomaticChallenge = false,
DisplayName = "ADFS",
Authority = $"https://{options.AdfsHostName}/adfs/oauth2",
ClientId = options.ClientID,
ResponseType = "id_token",
Scope = { "openid profile" },
CallbackPath = new PathString("/signin-adfs"),
SignedOutCallbackPath = new PathString("/signout-callback-adfs"),
RemoteSignOutPath = new PathString("/signout-adfs"),
ClaimsIssuer = $"https://{options.AdfsHostName}/adfs/services/trust",
//TokenValidationParameters = new TokenValidationParameters
//{
// ValidateIssuer = true,
// ValidIssuer = $"https://{options.AdfsHostName}/adfs/services/trust"
//},
};
app.UseOpenIdConnectAuthentication(connectOptions);
我在每次通话时都收到非常快的 401,并带有有效的令牌。事实上,虽然我在控制台 window 中看到了连接,但我在 Roslyn 控制台 window 中没有看到任何其他关于安全验证的日志。
我目前正在使用 ASP.Net Core 1.1.X,如果可以的话,我会避免迁移到 .Net Core 2.0,因为我们在项目后期,它包含许多重大变化...
随时询问更多信息,我将不胜感激所有好的建议!
只有 ADFS 2016 支持 OpenID Connect。如果要在 2012 中使用 OAuth 端点,则需要编写自己的授权处理程序。构建的示例是 ASP.NET Core's own Twitter implementation。请注意,这些处理程序需要在 ASP.NET Core 1.* 与 2.0+.
中以不同方式实现
事实证明,我们可以在 ADFS 3.0 中使用 JwtBearerAuthentication。
我最初的问题是它去 /.well-known/openid-configuration 获取元数据,但 ADFS 3.0 不支持 OpenID 并且这个 returns 404。
我在另一个 post 中读到(我会在找到它时更新它)如果配置正确,它不需要获取配置。但是什么配置?
好吧,我在 (MS) 代码的深处发现,如果将 OpenIdConnectConfiguration 对象传递给 JwtBearerOptions 的配置 属性,它不会获取元数据。
现在这是我的代码:
var rawCertData = Convert.FromBase64String(options.X509SigninCertificate);
X509Certificate2 cert = new X509Certificate2(rawCertData);
SecurityKey signingKey = new X509SecurityKey(cert);
X509 证书数据来自此 url
支持的 adfs 元数据
https://Your.ADFS.Site/FederationMetadata/2007-06/FederationMetadata.xml
它包含这个:
<KeyDescriptor use="signing">
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
<X509Data>
<X509Certificate>SOMEUUENCDODEDSTRING=</X509Certificate>
</X509Data>
</KeyInfo>
</KeyDescriptor>
我只是在设置的 X509SigninCertificate 属性.
中复制了 UUEncoded 字符串
var tokenValidationParameters = new TokenValidationParameters
{
// The signing key must match!
ValidateIssuerSigningKey = true,
IssuerSigningKey = signingKey,
// Validate the JWT Issuer (iss) claim
ValidateIssuer = true,
ValidIssuer = $"https://{options.AdfsHostName}/adfs/services/trust",
// Validate the JWT Audience (aud) claim
ValidateAudience = true,
ValidAudience = options.ClientUri, //"https://YOUR-AUDIENCE/",
// Validate the token expiry
ValidateLifetime = true,
// If you want to allow a certain amount of clock drift, set that here:
ClockSkew = TimeSpan.Zero
};
var connectOptions = new OpenIdConnectConfiguration
{
Issuer = $"https://{options.AdfsHostName}/adfs/services/trust",
};
app.UseJwtBearerAuthentication(new JwtBearerOptions
{
AutomaticAuthenticate = true,
AutomaticChallenge = true,
TokenValidationParameters = tokenValidationParameters,
Configuration = connectOptions
});
这里重要的一行是
Configuration = connectOptions
通过这样做,您告诉验证器不要获取元数据。就这么简单。
我能够验证我的令牌(AUD、ISS 和 SIGN)并且我可以在我的项目中使用 ADFS。
我需要配置我的 .Net Core Web Api (.Net Framework) 以使用 ADFS 3.0 (2012) 来验证我们的移动客户端发送的 Bearer 令牌。
我能够从 ADFS 服务器生成 access_token,并在授权中传递它 header。
我的问题在 API:如何配置它来验证和自动授权用户?
我找了很多地方都没有找到确定的方法。
到目前为止我尝试了什么:
使用 IdentityServer4(失败,因为它使用 JWT 而 ADFS 不提供 OpenID 尝试过 UseOpenIdConnectAuthentication(在 IdentityServer4 找到示例) 自定义中间件 我不能使用其他方法,我需要支持 oAuth2。
那么,我该怎么做呢?
这是我最近的尝试:
var connectOptions = new OpenIdConnectOptions
{
AuthenticationScheme = "adfs",
SignInScheme = "idsrv.external", //IdentityServerConstants.ExternalCookieAuthenticationScheme,
SignOutScheme = "idsrv", //IdentityServerConstants.SignoutScheme,
AutomaticChallenge = false,
DisplayName = "ADFS",
Authority = $"https://{options.AdfsHostName}/adfs/oauth2",
ClientId = options.ClientID,
ResponseType = "id_token",
Scope = { "openid profile" },
CallbackPath = new PathString("/signin-adfs"),
SignedOutCallbackPath = new PathString("/signout-callback-adfs"),
RemoteSignOutPath = new PathString("/signout-adfs"),
ClaimsIssuer = $"https://{options.AdfsHostName}/adfs/services/trust",
//TokenValidationParameters = new TokenValidationParameters
//{
// ValidateIssuer = true,
// ValidIssuer = $"https://{options.AdfsHostName}/adfs/services/trust"
//},
};
app.UseOpenIdConnectAuthentication(connectOptions);
我在每次通话时都收到非常快的 401,并带有有效的令牌。事实上,虽然我在控制台 window 中看到了连接,但我在 Roslyn 控制台 window 中没有看到任何其他关于安全验证的日志。
我目前正在使用 ASP.Net Core 1.1.X,如果可以的话,我会避免迁移到 .Net Core 2.0,因为我们在项目后期,它包含许多重大变化...
随时询问更多信息,我将不胜感激所有好的建议!
只有 ADFS 2016 支持 OpenID Connect。如果要在 2012 中使用 OAuth 端点,则需要编写自己的授权处理程序。构建的示例是 ASP.NET Core's own Twitter implementation。请注意,这些处理程序需要在 ASP.NET Core 1.* 与 2.0+.
中以不同方式实现事实证明,我们可以在 ADFS 3.0 中使用 JwtBearerAuthentication。
我最初的问题是它去 /.well-known/openid-configuration 获取元数据,但 ADFS 3.0 不支持 OpenID 并且这个 returns 404。
我在另一个 post 中读到(我会在找到它时更新它)如果配置正确,它不需要获取配置。但是什么配置?
好吧,我在 (MS) 代码的深处发现,如果将 OpenIdConnectConfiguration 对象传递给 JwtBearerOptions 的配置 属性,它不会获取元数据。
现在这是我的代码:
var rawCertData = Convert.FromBase64String(options.X509SigninCertificate);
X509Certificate2 cert = new X509Certificate2(rawCertData);
SecurityKey signingKey = new X509SecurityKey(cert);
X509 证书数据来自此 url
支持的 adfs 元数据https://Your.ADFS.Site/FederationMetadata/2007-06/FederationMetadata.xml
它包含这个:
<KeyDescriptor use="signing">
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
<X509Data>
<X509Certificate>SOMEUUENCDODEDSTRING=</X509Certificate>
</X509Data>
</KeyInfo>
</KeyDescriptor>
我只是在设置的 X509SigninCertificate 属性.
中复制了 UUEncoded 字符串var tokenValidationParameters = new TokenValidationParameters
{
// The signing key must match!
ValidateIssuerSigningKey = true,
IssuerSigningKey = signingKey,
// Validate the JWT Issuer (iss) claim
ValidateIssuer = true,
ValidIssuer = $"https://{options.AdfsHostName}/adfs/services/trust",
// Validate the JWT Audience (aud) claim
ValidateAudience = true,
ValidAudience = options.ClientUri, //"https://YOUR-AUDIENCE/",
// Validate the token expiry
ValidateLifetime = true,
// If you want to allow a certain amount of clock drift, set that here:
ClockSkew = TimeSpan.Zero
};
var connectOptions = new OpenIdConnectConfiguration
{
Issuer = $"https://{options.AdfsHostName}/adfs/services/trust",
};
app.UseJwtBearerAuthentication(new JwtBearerOptions
{
AutomaticAuthenticate = true,
AutomaticChallenge = true,
TokenValidationParameters = tokenValidationParameters,
Configuration = connectOptions
});
这里重要的一行是
Configuration = connectOptions
通过这样做,您告诉验证器不要获取元数据。就这么简单。
我能够验证我的令牌(AUD、ISS 和 SIGN)并且我可以在我的项目中使用 ADFS。