编写可通过 asp.net 身份用户和不记名令牌访问的单个 API
Posted
技术标签:
【中文标题】编写可通过 asp.net 身份用户和不记名令牌访问的单个 API【英文标题】:write single API accessible through asp.net identity user and bearer token both 【发布时间】:2016-05-16 07:42:48 【问题描述】:我创建了 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 控制器,那就只尊重不记名令牌,而不是身份用户。
感谢任何帮助!
【问题讨论】:
【参考方案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 + Bearer 身份验证,你应该强烈考虑实施 XSRF 对策。
【讨论】:
就技术指导而言,这正是我所寻找的。在架构方面还有 1 个问题,在移动应用程序 web api 和 .net mvc web 应用程序之间重用代码的最佳方式是什么?我会阅读更多关于 XSRF 的内容,谢谢。 您认为此答案中显示的解决方案可能有帮助吗? ***.com/questions/11476883/… 是的,这是一个选项。请注意,在 RC2 中,cookie 中间件可能会具有内置的防伪对策,所以也许您应该等到下一个 RC:github.com/aspnet/Security/pull/692。以上是关于编写可通过 asp.net 身份用户和不记名令牌访问的单个 API的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET Core API 使用 JWT 不记名令牌进行身份验证
JWT 不记名令牌不适用于 ASP.Net Core 3.1 + Identity Server 4