写入单个 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反制措施。
我创建了 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反制措施。