On yıllar boyunca çeşitli kimlik doğrulama ve yetkilendirme tekniklerini kullandım, mevcut MVC uygulamam aşağıdaki metodolojiyi kullanıyor.
Hak talepleri tüm yetkilendirmeler için kullanılır. Kullanıcılara bir rol atanır (birden fazla rol mümkündür ancak buna ihtiyacım yok) - daha fazlası aşağıda.
Yaygın uygulamada olduğu gibi, ClaimsAuthorize öznitelik sınıfı kullanılır. Çoğu denetleyici eylemi CRUD olduğundan, kod ilk veritabanı oluşturmada tüm denetleyici eylemlerini yineleyen ve Oku / Düzenle / Oluştur / Sil'in her denetleyici eylem özniteliği için talep türleri oluşturan bir rutinim var. Örneğin,
[ClaimsAuthorize("SomeController", "Edit")]
[HttpPost]
MVC Görünümünde kullanım için, temel denetleyici sınıfı çanta öğelerini görüntüler
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
var user = filterContext.HttpContext.User as System.Security.Claims.ClaimsPrincipal;
if (user != null)
{
List<Claim> claims = user.Claims.Where(c => c.Type == this.GetType().Name).ToList();
ViewBag.ClaimRead = claims.Any(c => c.Value == "Read");
ViewBag.ClaimEdit = claims.Any(c => c.Value == "Edit");
ViewBag.ClaimCreate = claims.Any(c => c.Value == "Create");
ViewBag.ClaimDelete = claims.Any(c => c.Value == "Delete");
}
base.OnActionExecuting(filterContext);
}
Web sitesi menüleri ve denetleyici olmayan diğer eylemler için başka iddialarım var. Örneğin, bir kullanıcının belirli bir parasal alanı görüntüleyip görüntüleyemeyeceği.
bool UserHasSpecificClaim(string claimType, string claimValue)
{
var user = this.HttpContext.User as System.Security.Claims.ClaimsPrincipal;
if (user != null)
{
return user.Claims.Any(c => c.Type == claimType && c.Value == claimValue);
}
return false;
}
public bool UserHasTradePricesReadClaim
{
get
{
return UserHasSpecificClaim("TradePrices", "Read");
}
}
Peki, Roller nereye uyuyor?
Bir Rolü bir (varsayılan) talepler kümesine bağlayan bir tablom var. Kullanıcı yetkilendirmesini ayarlarken, varsayılan, kullanıcıya rollerinin hak taleplerini vermektir. Her kullanıcının varsayılandan daha fazla veya daha az hak talebi olabilir. Düzenlemeyi basitleştirmek için, talepler listesi denetleyici ve eylemler (arka arkaya) tarafından gösterilir, ardından diğer talepler listelenir. Düğmeler, talepleri seçmek için gereken "tıklamayı" en aza indirmek için bir dizi eylemi seçmek için biraz Javascript ile kullanılır. Kaydedildiğinde, kullanıcıların talepleri silinir ve seçilen tüm talepler eklenir. Web uygulaması talepleri yalnızca bir kez yükler, bu nedenle herhangi bir değişiklik bu statik verilerde bir yeniden yükleme yapılmasını gerektirmelidir.
Bu nedenle yöneticiler, her bir rolde hangi taleplerin olduğunu ve bir kullanıcının bir role ve bu varsayılan taleplere atadıktan sonra hangi iddialara sahip olduğunu seçebilirler. Sistemin yalnızca az sayıda kullanıcısı vardır, bu nedenle bu verileri yönetmek kolaydır