编写可通过 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

使用不记名令牌授权 ASP.net mvc 操作方法

即使在 asp.net core 5.0 中提供了不记名令牌,也会返回 401 [关闭]

用户名/密码和不记名令牌之间的区别是啥?

ASP.NET 5 OAuth 持有者令牌身份验证