我们已使用.Net Core 2.1设置了身份服务器4。我们在.Net 4.6上有ASP.Net Web API。无法将其迁移到Core。我已经在该API项目中安装了IdentityServer3.AccessTokenValidation以及OWN和其他需要的软件包。我可以使用客户端,并从IdentityServer获取访问令牌。当客户端通过API使用该令牌时,我得到401。我在网上搜索了解决方案,但找不到任何可用于完成此工作的内容。 我尝试过-https://github.com/IdentityServer/IdentityServer3.AccessTokenValidation/issues/164 但没有用。我找不到任何样品。 所以我的问题是,是否不可能使用IdentityServer3.AccessTokenValidation与IDS4对话?
我是否需要设置IDS3?
更新
我打开了详细日志记录,并得到了以下内容
Microsoft.AspNetCore.Hosting.Internal.WebHost:Information: Request starting HTTP/1.1 POST http://localhost:44333/connect/introspect application/x-www-form-urlencoded 70
IdentityServer4.Hosting.IdentityServerMiddleware:Information: Invoking IdentityServer endpoint: IdentityServer4.Endpoints.IntrospectionEndpoint for /connect/introspect
IdentityServer4.Validation.ApiSecretValidator:Error: API validation failed.
IdentityServer4.Endpoints.IntrospectionEndpoint:Error: API unauthorized to call introspection endpoint. aborting.
Microsoft.AspNetCore.Hosting.Internal.WebHost:Information: Request finished in 26.5186ms 401
Microsoft.AspNetCore.Server.Kestrel:Information: Connection id "0HLIJ2C0UKBLN", Request id "0HLIJ2C0UKBLN:00000008": the application completed without reading the entire request body.
下面是我在Configuration方法中的API代码
var config = new HttpConfiguration();
config.MapHttpAttributeRoutes();
app.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions
{
Authority = "https://localhost:44333",
RequiredScopes = new[] { "api" },
ClientId = "api",
ClientSecret = "secret",
//DelayLoadMetadata = true
});
app.UseWebApi(config);
ApiResource的IDS4一侧的代码。
public static IEnumerable<ApiResource> GetApiResources()
{
return new List<ApiResource>
{
new ApiResource("api", "MyApi") { ApiSecrets = { new Secret("secret".Sha256()) } }
};
}
更新2
是,我已启用跟踪。在更多地使用代码并重新安装软件包之后,我现在遇到了另一个错误。对/ connect / accesstokenvalidation发出了请求。该端点在IDS4中不可用
Microsoft.AspNetCore.Hosting.Internal.WebHost:信息:请求启动HTTP / 1.1 POST http://localhost:44333/connect/accesstokenvalidation application / x-www-form-urlencoded 70 Microsoft.AspNetCore.Hosting.Internal.WebHost:信息:请求在3.405毫秒内完成404 Microsoft.AspNetCore.Server.Kestrel:信息:连接ID为“ 0HLIJ9RBG591K”,请求ID为“ 0HLIJ9RBG591K:0000000A”:应用程序已完成,没有读取整个请求正文。
答案 0 :(得分:0)
好,最后我在头痛3天后就解决了。
connect / accesstokenvalidation是由于IdentityServer3.AccessTokenValidation的旧版本所致。我将其更新到版本2.15.1,并且下装了 System.IdentityModel.Tokens.Jwt至4.0.2.206221351
我还向ApiResource添加了作用域,如下所示。但是,这可能不是必需的。没有它,我还没有测试。
public static IEnumerable<ApiResource> GetApiResources()
{
return new List<ApiResource>
{
new ApiResource("my_api", "SmartBiz Api")
{
ApiSecrets = { new Secret("secret".Sha256()) },
Scopes =
{
new Scope("the_api")
}
}
};
}
感谢您的帮助Rosdi Kasim
答案 1 :(得分:0)
我花了几天时间来解决一个问题,所以我想我会在我的发现中添加一个答案。我使用的是 IDS4 和 .net 4.7 web api。
验证客户端“API”(即 .net 4.7 应用程序)时的主要痛点,使用 IdentityServer4 dotnet 核心令牌服务器进行身份验证。问题是这样的。
.net 4.7 Web API Project的Startup.cs中设置的ClientID和ClientSecret就是API资源的ID和Secret。
首先,您点击 IDS4 /token 端点以获取令牌。该请求需要在 IDS4 项目的 Config.cs 文件中设置 client_id 和 client_secret(以及其他必需的值)。
public static IEnumerable<ApiResource> Apis =>
new ApiResource[]
{
new ApiResource("api", "My DotNet 4.7 API"){ //.net 4.7 API clientId
ApiSecrets = new List<Secret>()
{
new Secret("secret".Sha256()) //.net 4.7 API client secret
},
Scopes = { "api"}
}
};
public static IEnumerable<Client> Clients =>
new Client[]
{
new Client
{
ClientId = "client",
...
// secret for authentication
ClientSecrets =
{
new Secret("secret1".Sha256())
},
...
}
};
现在使用该令牌,您可以将其传递给 .net 4.7 Api 端点。这是我收到“401 UnAuthorized”的地方。解决方案在“启动”文件中,特别是这部分:
app.UseIdentityServerBearerTokenAuthentication(
new IdentityServerBearerTokenAuthenticationOptions
{
.....
//this is the API Resource Id and Secret for that API resource
ClientSecret = "secret",
ClientId = "api"
});
出于某种原因,我不清楚我必须在 API 的配置中使用 API 资源值。现在说得通。但出于某种原因,我准备的所有资源都没有明确指出这一点。