Identity Server 4的API授权不断返回401未经授权

时间:2019-11-28 21:12:57

标签: asp.net-core identityserver4 openid-connect jwt-auth

我使用的是Identity Server 4 .Net Core 3,如果我在启动时使用标准配置,我的API端点将不验证访问令牌,但我会一直获得401未经授权,但是当我在控制器中使用authorize属性设置身份验证方案时,我可以使用相同的令牌成功访问我的端点...

-D OPENCV_EXTRA_MODULES_PATH=/home/pi/opencv_contrib/modules \

这是我的Identity Server配置:

[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;
}

我的API配置

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;
    } 

最后是我的Web应用程序,OIDC配置以及如何获取访问令牌:

 services.AddAuthentication("Bearer")
            .AddJwtBearer("Bearer", options =>
            {
                options.Authority = _securityConfig.Authority;
                options.RequireHttpsMetadata = false;

                options.Audience = "identity";
            });

关于我为什么不断获得401未经授权的任何想法吗?

1 个答案:

答案 0 :(得分:2)

基于上述行为,我认为这可能与中间件配置有关,更具体地说,与中间件的顺序有关。但是我不确定,因为问题中没有Startup.Configure。

幸运的是,雅克可以确认问题确实出在订单上。如评论中所述:

app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
app.UseAuthentication();

这里的问题是,首先对用户进行了授权(UseAuthorization),然后对用户进行了认证(UseAuthentication)。因此,永远无法对用户进行授权,因为此时用户是未知的(匿名)。但是稍后,当验证了属性时,就会知道用户。所以这解释了为什么有效。

为了解决此问题,必须切换语句。首先验证用户身份(识别用户,谁是用户?),然后授权用户:

app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();

documentation中描述了该顺序。