我已经在点网核心api中创建了openiddict令牌,并且该应用程序托管在localhost / UserManagementAPI上。当我尝试授权相同的API时,我就能做到。但是,当我尝试使用相同的令牌并授权其他API localhost / SalesAPI时,会出现未经授权的访问错误。
令牌生成代码如下UserManagementAPI / startup.cs
services.AddAuthentication().AddOpenIdConnectServer(options =>
{
options.TokenEndpointPath = "/authorize";
options.AllowInsecureHttp = true;
options.Provider.OnValidateTokenRequest = context =>
{
if (!context.Request.IsPasswordGrantType() && !context.Request.IsRefreshTokenGrantType())
{
context.Reject(
error: OpenIdConnectConstants.Errors.UnsupportedGrantType,
description: "Only grant_type=password and refresh_token " +
"requests are accepted by this server.");
return Task.CompletedTask;
}
if (string.IsNullOrEmpty(context.ClientId))
{
context.Skip();
return Task.CompletedTask;
}
if (string.Equals(context.ClientId, "client_id", StringComparison.Ordinal) &&
string.Equals(context.ClientSecret, "client_secret", StringComparison.Ordinal))
{
context.Validate();
}
return Task.CompletedTask;
};
options.Provider.OnHandleTokenRequest = context =>
{
if (context.Request.IsPasswordGrantType())
{
if (!string.Equals(context.Request.Username, "testusername", StringComparison.Ordinal) ||
!string.Equals(context.Request.Password, "testpassword", StringComparison.Ordinal))
{
context.Reject(
error: OpenIdConnectConstants.Errors.InvalidGrant,
description: "Invalid user credentials.");
return Task.CompletedTask;
}
var identity = new ClaimsIdentity(context.Scheme.Name,
OpenIdConnectConstants.Claims.Name,
OpenIdConnectConstants.Claims.Role);
identity.AddClaim(OpenIdConnectConstants.Claims.Subject, Guid.NewGuid().ToString());
identity.AddClaim("userid", "1001",
OpenIdConnectConstants.Destinations.AccessToken,
OpenIdConnectConstants.Destinations.IdentityToken);
var ticket = new AuthenticationTicket(
new ClaimsPrincipal(identity),
new AuthenticationProperties(),
context.Scheme.Name);
ticket.SetAccessTokenLifetime(TimeSpan.FromDays(1));
ticket.SetScopes(OpenIdConnectConstants.Scopes.Profile);
context.Validate(ticket);
}
return Task.CompletedTask;
};
});
我添加了以下代码以验证localhost / SalesAPI startup.cs中的令牌
services.AddOpenIddict();
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = "Bearer";
options.DefaultChallengeScheme = "Bearer";
}).AddOAuthValidation();
我不想使用授权服务器。
使用上述代码,我可以从localhost / UserManagementAPI授权其他api(相同的api负责生成令牌)
如果我在这里缺少东西,请告诉我。
答案 0 :(得分:0)
值得注意的是,您没有在此代码段中使用OpenIddict,而是使用AspNet.Security.OpenIdConnect.Server,这是为OpenIddict 1.x和2.x提供支持的低级OpenID Connect服务器中间件。
如果资源服务器位于单独的应用程序中,则需要将该应用程序配置为使用与主应用程序相同的ASP.NET Core数据保护密钥。看看ASOS - Token validation is not working when having separate authorization server and the resource server,了解有关如何执行此操作的更多信息。