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

时间:2014-04-25 03:53:40

标签: authentication authorization owin

我有一个我们需要保护的Web API项目。我计划允许在我的应用中注册的用户使用API​​ [表单身份验证],用户拥有自己的组织帐户[ADFS]和社交登录。

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

我认为我需要使用自己的IUser实现提供我自己的UserStore和UserManager的自定义实现。

请为此方案建议最佳做法。

3 个答案:

答案 0 :(得分:1)

通过注册多个身份验证中间件,您可以获得多个声明身份。

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

我肯定会在管道的末尾添加一个声明转换模块。 Thinktecture有一个例子。 ThinkTecture Owin Claims Transformer

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

简单的伪示例(适用于webapi,但概念相同)。使用bearer或basic或两者进行身份验证然后进行转换。

//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);

答案 1 :(得分:0)

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

  • 将业务逻辑与授权逻辑分离
  • 将授权逻辑表示为集中管理的集中授权策略
  • 通过公共图层保护您的API
  • 实现细粒度&amp;通过使用基于属性的访问控制(ABAC)实现动态访问控制,该控制扩展了RBAC(基于角色的访问控制)的可能性。

查看可扩展访问控制标记语言XACML。您可以在OASIS website找到更多信息。

还可以在ABAC上查看NIST的project

定义授权逻辑后,您可以决定如何强制执行。这可以通过在应用程序的输入处直接执行来完成,或者可以以供应方式完成,从而将从授权策略派生的权限馈送到认证令牌,例如, SAML作为属性分配。

HTH

答案 2 :(得分:0)

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

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

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

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

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

这是一个更简单的类似问题。

How do you setup mixed authorizations for different authentications in .net (web api 2 + owin)