我有一个我们需要保护的Web API项目。我计划允许在我的应用中注册的用户使用API [表单身份验证],用户拥有自己的组织帐户[ADFS]和社交登录。
我有可用于插件的所有中间件,并且可供用户使用。但是,在我的应用程序中,我确实有自定义角色和权限,以便我的应用程序根据现有权限授权服务调用。实现这一目标的最佳方法是什么。
我认为我需要使用自己的IUser实现提供我自己的UserStore和UserManager的自定义实现。
请为此方案建议最佳做法。
答案 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)
听起来您正在寻找外部授权。外化授权是以下行为:
查看可扩展访问控制标记语言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)