【发布时间】:2014-03-15 11:26:41
【问题描述】:
我阅读了很多博客文章和 stackoverflow 答案,但我仍然无法找到一个使用基于声明的身份验证和授权的真实世界开源项目,以便我了解如何实际实现这些。
到目前为止,我能找到的是 Thinktecture.IdentityModel 和 this blog 在示例网站上实现了基于声明的授权。如果你们能指出一些使用声明的开源项目,那将非常有帮助。
我感兴趣的是如何使用数据库检索我的应用程序的声明。
到目前为止,我尝试的是使用内存中的声明存储来模拟数据库,我已经创建了一个 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;
}
}
如何在没有太多 IF 条件的情况下在现实场景中实现这些?
【问题讨论】:
-
你是怎么做到的?能不能给个答案
标签: asp.net-mvc-4 authentication authorization claims-based-identity