我阅读了很多博客文章和stackoverflow的答案,但仍然找不到一个使用基于声明的身份验证和授权的真实世界的开源项目,因此我可以了解如何实际实现这些内容。
到目前为止,我能找到的是Thinktecture.IdentityModel,此博客在示例网站上实现了基于声明的授权。如果你们可以给我指出一些使用声明的开源项目,那将真的很有帮助。
我感兴趣的是如何使用数据库检索我的应用程序的声明。
到目前为止,我已经尝试过使用内存中的声明存储来模拟数据库,我已经创建了一个CustomClaimsTransformer
,CustomAuthorisationManager
就像这样。
public class CustomClaimsTransformer : ClaimsAuthenticationManager
{
public override ClaimsPrincipal Authenticate(string resourceName, ClaimsPrincipal incomingPrincipal)
{
//validate name claim
string nameClaimValue = incomingPrincipal.Identity.Name;
return CreatePrincipal(nameClaimValue);
}
private ClaimsPrincipal CreatePrincipal(string userName)
{
int userId = ClaimStore.Users.First(u => u.Value == userName).Key;
var claims = ClaimStore.ClaimsSet.Where(c => c.Key == userId);
var claimsCollection = claims.Select(kp => kp.Value).ToList();
return new ClaimsPrincipal(new ClaimsIdentity(claimsCollection, "Custom"));
}
}
public class CustomAuthorisationManager : ClaimsAuthorizationManager
{
public override bool CheckAccess(AuthorizationContext context)
{
string resource = context.Resource.First().Value;
string action = context.Action.First().Value;
if (action == "Show" && resource == "Code")
{
bool likesJava = context.Principal.HasClaim(ClaimStore._httpMyclaimsUsers, "True");
return likesJava;
}
else if (action == "Read" && resource == "Departments")
{
bool readDeps = context.Principal.HasClaim(ClaimStore._httpMyclaimsDepartments, "Read");
return readDeps;
}
return false;
}
}
如何在没有太多中频条件的情况下在现实世界中实现这些功能?
最终,我使用现有的asp.net Identity 2.0表和一些我的表设计了具有所需功能的我自己的系统。
我将每个AREA-CONTROLLER-ACTION三人组称为系统中的资源。包含WebAPI。区域本身就是一种资源。控制器本身就是一种资源。动作本身就是一种资源。它们的任何组合也是一种资源。我将使用反射自动从系统本身生成一切。
另外,我将使用相同的AspNetRoles
表来存储我的用户组。用户属于一个或多个组(超级管理员,管理员,代理,客户端等)。
使用现有的基于角色的模型作为具有声明的基于用户组的模型,我可以使其正常工作。超级管理员处于上帝模式。他们可以创建较低级别的用户/组/分配权限等。
用户可以具有特殊权限。例如,“代理中的所有人”组被拒绝访问更新酒店的权限,但是可以为特定的代理(也可能是酒店的所有者)提供特定的访问权限,以便仅更新其酒店。
由于整个访问控制系统都在MVC区域控制器动作集上运行。最初没有人没有访问权限(包括超级管理员),我们逐步定义了组/用户可以访问的部分。并且我们通过声明为超级管理员和管理员授予独占访问权限。默认情况下,拒绝访问任何地方。
一旦我自动生成了AREA-CONTROLLER-ACTION设置,我就让用户选择了哪个组可以访问哪个项目。
当用户登录时,我会获得当前用户有权访问的所有资源,并将其存储为声明。基于此,使用声明身份验证管理器,当用户请求访问某些资源时,我可以检查其声明并决定是否应授予他们访问权限。
foreach(var claim in permissionClaims) {
var parts = claim.Value.Split(new [] {
'|'
}, StringSplitOptions.None);
if (parts.Length == 3) {
//var httpMethod = parts[0];
var action = parts[1];
var api = parts[2];
//Current.Log.Warn("Checking Access : " + req + " [action: " + action + "]");
// is this request for a API action?
if (api.Contains("API")) {
// if so, req must be for a API action
if (req.Contains("Api") && action.Contains(req)) {
Log.Trace("User has access to API : " + req + " [action: " + action + "]");
return true;
}
} else {
// this is for a MVC action
if (action.Contains(req)) {
Log.Trace("User has access to MVC : " + req + " [action: " + action + "]");
return true;
}
}
}
}
我在这里详细解释了该方法-ASP.NET MVC细粒度身份和访问控制。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句