写入单个 API 可通过 asp.net 身份用户和持有者令牌访问

write single API accessible through asp.net identity user and bearer token both

我创建了 asp.net mvc 6 应用程序并使用 entity framework 7 配置了 asp.net 身份用户,工作正常。然后我添加了 AspNet.Security.OpenIdConnect.Server 令牌提供者服务器,它也工作正常。

然后我创建了一个api控制器如下:

[Route("api/[controller]")]
    public class ValuesController : Controller
    {
        // GET: api/values
        [Authorize(Policy = "SomePolicy")]
        [HttpGet]
        public IEnumerable Get()
        {
            return new string[] { "value1", "value2" };
        }
    }

问题: 我想以这样的方式配置授权,以便承载令牌或 asp.net 身份用户有效(并且属于某个角色),我想允许用户访问 API.

这是我在 startup.cs 中尝试过的:

 services.AddAuthorization(options => {
                // Add a new policy requiring a "scope" claim
                // containing the "api-resource-controller" value.
                options.AddPolicy("API", policy => {
                    policy.AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme);
                    policy.RequireClaim(OpenIdConnectConstants.Claims.Scope, "offline_access");                                        
                });                
            });

然后,如果我将 [Authorize(Policy="API")] 添加到我的 api 控制器,那就是仅尊重不记名令牌,而不是身份用户。

感谢任何帮助!

policy.AddAuthenticationSchemes 支持多种方案,所以你可以 - 理论上 - 做这样的事情:

services.AddAuthorization(options => {
    options.AddPolicy("API", policy => {
        policy.AddAuthenticationSchemes(
            /* Scheme 1: */ JwtBearerDefaults.AuthenticationScheme,
            /* Scheme 2: */ typeof(IdentityCookieOptions).Namespace + ".Application");
    });
});

Note: typeof(IdentityCookieOptions).Namespace + ".Application" is the default authentication scheme used by ASP.NET Identity 3: https://github.com/aspnet/Identity/blob/3.0.0-rc1/src/Microsoft.AspNet.Identity/IdentityCookieOptions.cs#L61

或者,您也可以删除 policy.AddAuthenticationSchemes 调用并将 bearer 和 cookies 中间件配置为使用自动身份验证(AutomaticAuthenticate = true,这是 cookies 中间件的默认值,但不是JWT 中间件)。


实际上,绝对不推荐,因为它违背了使用仅承载身份验证的全部目的:减轻 XSRF 攻击。如果你真的想支持cookies+bearer authentication,你应该强烈考虑实施XSRF反制措施。