Authentication 通过OWIN对Web API的多重身份验证/授权支持

Authentication 通过OWIN对Web API的多重身份验证/授权支持,authentication,authorization,owin,Authentication,Authorization,Owin,我有一个我们的Web API项目需要保护。我计划允许在我的应用程序中注册的用户使用API[Forms Authentication],允许拥有自己的组织帐户[ADF]和社交登录的用户 我有所有可用于插件的中间件,并可供用户使用。但是,在我的应用程序中,我确实具有要提供的自定义角色和权限,以便我的应用程序基于现有权限授权服务调用。实现这一目标的最佳方式是什么 我认为我将被要求提供我自己的自定义UserStore和UserManager实现以及我自己的IUser实现 请建议此场景的最佳实践。听起来您

我有一个我们的Web API项目需要保护。我计划允许在我的应用程序中注册的用户使用API[Forms Authentication],允许拥有自己的组织帐户[ADF]和社交登录的用户

我有所有可用于插件的中间件,并可供用户使用。但是,在我的应用程序中,我确实具有要提供的自定义角色和权限,以便我的应用程序基于现有权限授权服务调用。实现这一目标的最佳方式是什么

我认为我将被要求提供我自己的自定义UserStore和UserManager实现以及我自己的IUser实现


请建议此场景的最佳实践。

听起来您正在寻找外部化授权。外部化授权是指以下行为:

  • 将业务逻辑与授权逻辑分离
  • 将授权逻辑表示为集中管理的集中授权策略
  • 通过公共层保护API
  • 通过使用基于属性的访问控制(ABAC)实现细粒度动态访问控制,它扩展了RBAC(基于角色的访问控制)的可能性
看看XACML,一种可扩展的访问控制标记语言。你可以找到更多关于绿洲的信息

还可以查看ABAC上的NIST

一旦定义了授权逻辑,就可以决定如何实施它。这可以通过在应用程序输入时直接强制执行来实现,也可以通过设置方式来实现,通过设置方式,将从授权策略派生的权限作为属性分配输入到身份验证令牌中,例如SAML


HTH

这就是我最终为一个具有类似需求的系统所设计的。关键是要分离身份验证和授权逻辑

  • 构建Owin身份验证中间件组件,这些组件负责根据您提到的各种登录方法建立用户身份。看来你已经完成了。根据用户设置ASP.NET标识

  • 从存储中检索登录用户的角色/权限。这可以作为单独的Owin中间件或身份验证的一部分来完成。将权限作为声明添加到主体

  • 扩展您的角色/权限存储,以将API服务操作映射到应用程序权限

  • 实现自定义API授权属性并将其应用于每个API操作。在此属性中,您可以访问操作名称和用户声明(权限)。将声明与您在上述步骤中映射的权限相匹配。如果存在匹配项,则返回IsAuthorized=true,否则返回false

在更简单的层面上,这里有一个类似的问题


注册多个身份验证中间件后,您可以获得多个类别实体

注册要支持的每种身份验证类型

我肯定会在管道的末尾添加一个索赔转换模块。Thinktecture就是一个例子

这将为您提供一个位置,以便在一个位置查找和添加经过身份验证的用户的所有应用程序类型声明

简单的伪示例(面向webapi,但概念相同)。使用承载或基本或两者进行身份验证,然后转换

//identity 2.0 user manager stuff used in your modules
app.CreatePerOwinContext(ApplicationSession.Create);
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);

// Token Authentication -> get a principle
app.UseOAuthBearerAuthentication(OAuthBearerOptions);

// Basic Authentication. -> get a principle
app.UseBasicAuthentication(app.CreateLogger<BasicAuthenticationMiddleware>(), 
                "Realm", ValidateUser);

// transform claims to application identity.  Add additional claims if needed
app.UseClaimsTransformation(TransformClaims);
//模块中使用的identity 2.0用户管理器
app.CreatePerOwinContext(ApplicationSession.Create);
app.CreatePerOwinContext(ApplicationUserManager.Create);
//令牌身份验证->获取原则
应用程序使用OAuthBeareAuthentication(OAuthBeareOptions);
//基本身份验证。->得到一个原则
app.UseBasicAuthentication(app.CreateLogger(),
“王国”,尤瑟);
//将声明转换为应用程序标识。如果需要,添加其他索赔
应用程序使用索赔信息(转换索赔);

请注意,我的文章与处理OWINThen的外部登录有关,请考虑你的问题。你说的是授权和用户权限。