1

我已经创建了 asp.net mvc 6 应用程序并使用实体框架 7 配置了 asp.net 身份用户,工作正常。然后我添加 AspNet.Security.OpenIdConnect.Server了也可以正常工作的令牌提供程序服务器。

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

[路由(“api/[控制器]”)]
    公共类 ValuesController : 控制器
    {
        // 获取:api/值
        [授权(政策=“某些政策”)]
        [HttpGet]
        公共 IEnumerable Get()
        {
            返回新字符串[] { "value1", "value2" };
        }
    }

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

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

services.AddAuthorization(options => {
                // 添加一个需要“范围”声明的新策略
                // 包含“api-resource-controller”值。
                options.AddPolicy("API", policy => {
                    policy.AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme);
                    policy.RequireClaim(OpenIdConnectConstants.Claims.Scope, "offline_access");                                        
                });                
            });

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

任何帮助表示赞赏!

4

1 回答 1

1

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

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

注意:typeof(IdentityCookieOptions).Namespace + ".Application"是 ASP.NET Identity 3 使用的默认身份验证方案: https ://github.com/aspnet/Identity/blob/3.0.0-rc1/src/Microsoft.AspNet.Identity/IdentityCookieOptions.cs#L61

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


在实践中,绝对不推荐这样做,因为它违背了使用仅承载身份验证的全部目的:减轻 XSRF 攻击。如果你真的想支持 cookie + 承载认证,你应该强烈考虑实施 XSRF 对策。

于 2016-02-06T13:48:12.553 回答