首页 文章

编写可通过asp.net身份用户和承载令牌访问的单个API

提问于
浏览
1

我已经创建了asp.net mvc 6应用程序并使用实体框架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控制器,那只是尊重承载令牌,而不是身份用户 .

任何帮助表示赞赏!

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中间件) .


    在实践中,它绝对是 not recommended ,因为它击败了使用仅承载身份验证的整个目的:减轻XSRF攻击 . 如果您真的想支持cookie承载认证,那么 should strongly 考虑实施XSRF对策 .

相关问题