我正在使用 Identity Server 4 .Net Core 3,如果我在启动文件中使用标准配置,我的API端点不会验证访问令牌,我一直收到401未授权的错误提示。但是当我在控制器中使用authorize属性来设置身份验证方案时,我可以使用相同的令牌成功访问我的端点...
[Route("api/[controller]")]
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
[ApiController]
public class MyWebAPiControllerController : ControllerBase
{
.......
以下是我的身份验证服务器配置:
//API resource
public IEnumerable<ApiResource> Apis()
{
var resources = new List<ApiResource>();
resources.Add(new ApiResource("identity", "My API", new[] { JwtClaimTypes.Subject, JwtClaimTypes.Email, JwtClaimTypes.Role, JwtClaimTypes.Profile }));
return resources;
}
我的客户端配置:
public IEnumerable<Client> Clients()
{
var Clients = new List<Client>();
Clients.Add(new Client
{
ClientId = "client",
ClientSecrets = { new Secret(_securityConfig.Secret.Sha256()) },
AllowedGrantTypes = GrantTypes.ClientCredentials,
// scopes that client has access to
AllowedScopes = { "identity" }
});
Clients.Add(new Client
{
ClientId = "mvc",
ClientName = "MVC Client",
AllowedGrantTypes = GrantTypes.HybridAndClientCredentials,
//RequirePkce = true,
ClientSecrets = { new Secret(_securityConfig.Secret.Sha256()) },
RequireConsent = false,
RedirectUris = _securityConfig.RedirectURIs,
FrontChannelLogoutUri = _securityConfig.SignoutUris,
PostLogoutRedirectUris = _securityConfig.PostLogoutUris,
AllowOfflineAccess = true,
AllowAccessTokensViaBrowser = true,
AllowedScopes = new List<string>
{
IdentityServerConstants.StandardScopes.OpenId,
IdentityServerConstants.StandardScopes.Profile,
IdentityServerConstants.StandardScopes.Email,
IdentityServerConstants.StandardScopes.OfflineAccess,
"identity"
}
});
return Clients;
}
我的API配置
services.AddAuthentication("Bearer")
.AddJwtBearer("Bearer", options =>
{
options.Authority = _securityConfig.Authority;
options.RequireHttpsMetadata = false;
options.Audience = "identity";
});
最后是我的Web应用程序,OIDC配置以及如何获取访问令牌:
services.AddAuthentication(options =>
{
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = "oidc";
}).AddCookie(options =>
{
options.ExpireTimeSpan = TimeSpan.FromMinutes(60);
options.Cookie.Name = "identity_cookie";
})
.AddOpenIdConnect("oidc", options =>
{
options.Events = new OpenIdConnectEvents
{
OnUserInformationReceived = async ctx =>
{
//Get Token here and assign to Cookie for use in Jquery
ctx.HttpContext.Response.Cookies.Append("bearer_config", ctx.ProtocolMessage.AccessToken);
}
};
options.Authority = _securityConfig.Authority;
options.RequireHttpsMetadata = false;
options.ClientId = "mvc";
options.ClientSecret = _securityConfig.Secret;
options.ResponseType = "code id_token";
options.SaveTokens = true;
options.Scope.Clear();
options.Scope.Add("openid");
options.Scope.Add("profile");
options.Scope.Add("email");
options.Scope.Add("identity");
options.Scope.Add("offline_access");
options.ClaimActions.MapAllExcept("iss", "nbf", "exp", "aud", "nonce", "iat", "c_hash");
options.GetClaimsFromUserInfoEndpoint = true;
//options.SaveTokens = true;
options.TokenValidationParameters = new TokenValidationParameters
{
NameClaimType = JwtClaimTypes.Name,
RoleClaimType = JwtClaimTypes.Role,
};
});
我一直收到401未经授权的错误,有什么想法吗?
UseAuthorization
语句。 - user4864425app.UseHttpsRedirection(); app.UseRouting(); app.UseAuthorization(); app.UseAuthentication();
- Jacques Bronkhorst