受保护的ASP.NET Core 2 MVC控制器中的承载令牌授权

时间:2018-12-04 10:22:41

标签: security asp.net-core asp.net-core-mvc openid-connect asp.net-core-2.1

我们有一个ASP.NET Core 2 MVC项目,该项目使用IdentityServer4保护其页面。常规控制器在未通过身份验证时会重定向到身份服务器,这是预期的行为。我要启用的功能是让非登录用户使用访问令牌来调用公共控制器方法,该访问令牌是由同一身份服务器提供给调用方的。如果用户具有有效的访问令牌,则该方法应正常运行,如果没有出现401错误或类似的错误。

问题是,即使使用Authorization: Bearer标头使用有效访问令牌调用该方法时,该方法也仅被重定向到IdentityServer。是否有可能实现我想要做的事情?我需要为此方法定义其他授权方案吗?

这是OIDC配置:

void oidcOptions(OpenIdConnectOptions options)
            {
                options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;

                options.Authority = openIdSettings.StsAuthority;
                options.RequireHttpsMetadata = openIdSettings.DiscoveryEndpointRequiresHttps;

                options.ClientId = openIdSettings.ClientId;
                options.ClientSecret = openIdSettings.ClientSecret;

                options.ResponseType = "code id_token";
                options.SaveTokens = true;
                options.UseTokenLifetime = true;

                options.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters
                {
                    NameClaimType = ClaimTypes.Name,
                    RoleClaimType = ClaimTypes.Role,
                };

                options.Scope.Remove("profile");

                foreach (string scope in openIdSettings.Scopes)
                {
                    options.Scope.Add(scope.Trim());
                }
            }

            services.AddAuthentication(options =>
            {
                options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme = AuthenticationConstants.SigninScheme;
            })
            .AddCookie(options =>
            {
                options.Cookie.Name = CookieAuthenticationDefaults.AuthenticationScheme;
            })
            .AddOpenIdConnect(AuthenticationConstants.SigninScheme, oidcOptions);

1 个答案:

答案 0 :(得分:0)

我已经解决了使用AddJwtBearer("token_scheme"..)作为现有方案的添加新身份验证方案,并使用[Authorize(AuthenticationSchemes = "token_scheme")]在方法上指定身份验证方案的问题。