我讀了很多博客文章和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條件的情況下在現實世界中實現這些?
你是怎麼做到的?你能否提供答案 – Moes