Asp.net core 使用ADFS 2012进行.net核心Api身份验证

Asp.net core 使用ADFS 2012进行.net核心Api身份验证,asp.net-core,oauth-2.0,adfs3.0,Asp.net Core,Oauth 2.0,Adfs3.0,我需要配置我的.Net核心Web Api(.Net Framework)以使用ADFS 3.0(2012)验证我们的移动客户端发送的承载令牌 我能够从ADFS服务器生成access_令牌,并将其传递到授权标头中 我的问题在API中:如何配置它来验证和自动调整用户 我搜索了很多地方,但找不到一个确定的方法 到目前为止,我尝试的是: Used IdentityServer4(失败,因为它使用JWT并且ADFS不提供OpenID 尝试使用OpenIDConnectAuthentication(在Ide

我需要配置我的.Net核心Web Api(.Net Framework)以使用ADFS 3.0(2012)验证我们的移动客户端发送的承载令牌

我能够从ADFS服务器生成access_令牌,并将其传递到授权标头中

我的问题在API中:如何配置它来验证和自动调整用户

我搜索了很多地方,但找不到一个确定的方法

到目前为止,我尝试的是:

Used IdentityServer4(失败,因为它使用JWT并且ADFS不提供OpenID 尝试使用OpenIDConnectAuthentication(在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,并带有一个有效的令牌。事实上,虽然我在控制台窗口中看到了连接,但在Roslyn控制台窗口中没有看到任何其他关于安全验证的日志

我目前使用的是ASP.Net Core 1.1.X,如果可以的话,我会避免使用.Net Core 2.0,因为我们的项目已经很晚了,它包含了很多突破性的更改


请随时询问更多信息,我将感谢所有好的建议!

只有ADFS 2016支持OpenID Connect。如果您想在2012年使用OAuth端点,您需要编写自己的授权处理程序。一个可以构建的示例是。请注意,这些处理程序需要在ASP.NET Core 1.*与2.0+中以不同的方式实现。

只有ADFS 2016支持OpenID Connect。如果您想在2012年使用OAuth端点,您需要编写自己的授权处理程序。一个构建的示例是。请注意,这些处理程序需要在ASP.NET Core 1.*vs 2.0+中以不同的方式实现。

事实证明,我们可以在ADFS 3.0中使用JWTBeareAuthentication

我最初的问题是,它在/.well/openid配置中获取元数据,但ADFS 3.0不支持openid,因此返回404

我在另一篇文章中读到(我会在找到它时更新它),如果配置正确,它就不需要获取配置。但是什么配置呢

我在(MS)代码中发现,如果将OpenIdConnectConfiguration对象传递给JWTBeareOptions的配置属性,它将无法获取元数据

下面是我的代码:

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>
这里的重点是

Configuration = connectOptions
通过这样做,您告诉验证器不要获取元数据


我能够验证我的令牌(AUD、ISS和SIGN),并且我可以在我的项目中使用ADFS。

事实证明,我们可以在ADFS 3.0中使用JWTBeareAuthentication

我最初的问题是,它在/.well/openid配置中获取元数据,但ADFS 3.0不支持openid,因此返回404

我在另一篇文章中读到(我会在找到它时更新它),如果配置正确,它就不需要获取配置。但是什么配置呢

我在(MS)代码中发现,如果将OpenIdConnectConfiguration对象传递给JWTBeareOptions的配置属性,它将无法获取元数据

下面是我的代码:

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>
这里的重点是

Configuration = connectOptions
通过这样做,您告诉验证器不要获取元数据


我能够验证我的令牌(AUD、ISS和签名)我可以在我的项目中使用ADFS。

您好,我正在努力使用ADFS和IdentityServer保护api。您有使用IdentityServer验证凭据和提供访问令牌的提示吗?我想在我的api中使用此端点,以便移动应用程序可以向我传递用户名和密码。有什么提示吗?我没有使用Identity最后,服务器,因为我能够绕过OpenId部分…是我们的移动应用程序与ADF交互,而不是我们的服务。我们的服务只验证oAuth令牌。您可以在IdentitySertver的文档/代码中查找绕过OpenId调用的方法,通常是获取证书和其他信息。您好,我正在处理同时使用adfs和IdentityServer保护api。您有关于使用IdentityServer验证凭据和提供访问令牌的提示吗?我希望在api中包含此端点,以便移动应用程序可以向我传递用户名和密码。有什么提示吗?我最后没有使用IdentityServer,因为我能够绕过OpenId部分。。。与ADFS交互的是我们的移动应用程序,而不是我们的服务。我们的服务仅验证oAuth令牌。您可能可以在IdentitySertver的文档/代码中查找绕过OpenID调用的方法,该调用通常用于获取证书和其他信息。