none
.NET CORE Policy Based Authorization özelleştirme RRS feed

  • Genel Tartışma

  • Merhaba,

    Projemde Claim-Policy ve Permission olacak şekilde birlikte bir yetkilendirme mekanizması kullanıyorum.

    Tüm controllerlar içerisinde kullanıcıda Bulunan Permission claimine göre erişebilme tagleri bulunuyor.

    PermissiınAuth.cs dosyası içerisinde claimler içerisinde sakladığım permissionlar bulunuyor. 

    Permission_Access claim yetkisine sahip olan tüm kullanıcılar sorunsuz bir şekilde erişim sağlayabilir.

    Örneğin bir firmanın Hizmet Süresi sona erdiğinde ClaimProvider.cs ile bunu kontrol ettirip Permission_Access yetkisini kaldırıyorum, ve bu sayede ilgili controllerlara erişimi kısılanmış oluyor fakat yapmak istediğim bu değil, çünkü tüm claim yetkileri için geriye aynı hata 403 forbidden hatası dönüyor, ben özellikle Permission_Access olmadığında geriye farklı bir hata döndürmek istiyorum ki front-end kısmında anlamlı bi mesaj kullanıcıya verebileyim. Örneğin Kullanıcıda Permission_Access yok ise hizmet süresi sona ermiş demek bu yüzden ilgili ödeme sayfasına ödeme yapmasıyla ilgili bilgilendirme yapmak istiyorum.

    Nasıl Yapabilirim Teşekkürler.

    Kodlarım aşağıdaki gibidir.



    AuthorizationPolicyProvider.cs

    public override Task<AuthorizationPolicy> GetPolicyAsync(string policyName)
    		{
    
    			if (!policyName.StartsWith(PermissionAuthorizeAttribute.PolicyPrefix, StringComparison.OrdinalIgnoreCase))
    			{
    				return base.GetPolicyAsync(policyName);
    			}
    
    			var permissionNames = policyName.Substring(PermissionAuthorizeAttribute.PolicyPrefix.Length).Split(',');
    
    			var policy = new AuthorizationPolicyBuilder()
    				.RequireAuthenticatedUser()
    				.RequireClaim(PermissionAuthorizeAttribute.PolicyPrefix, permissionNames)
    				.Build();
    
    			return Task.FromResult(policy);
    		}


    PermissionAuthorizeAttribute.cs

    internal const string PolicyPrefix = "PERMISSION:";
    
    	/// <summary>
    	/// Creates a new instance of <see cref="AuthorizeAttribute"/> class.
    	/// </summary>
    	/// <param name="permissions">A list of permissions to authorize</param>
    	public PermissionAuthorizeAttribute(params string[] permissions)
    	{
    		Policy = $"{PolicyPrefix}{string.Join(",", permissions)}";
    	}





    PermissionsAuth.cs

    public class PermissionsAuth
    	{
    
    		public const string Permission_Access = nameof(Permission_Access); // Accessing Perms.
    		public const string Permission_All = nameof(Permission_All);// All Perms.
    
    		public const string Urun_Kategorisi_Ekle_Duzenle = nameof(Urun_Kategorisi_Ekle_Duzenle); //Ürün Kategorisi Oluşturma ve Düzenleme Yetkisi
    		public const string Urun_Kategorisi_Sil = nameof(Urun_Kategorisi_Sil); // Ürün Kategorisi Silme Yetkisi
    		public const string Urun_Ekle_Duzenle = nameof(Urun_Ekle_Duzenle); // Ürün Ekleme ve Düzenleme Yetkisi
    		public const string Urun_Sil = nameof(Urun_Sil); // Ürün Silme Yetkisi
    
        }

    ClaimProvider.cs

    public async Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
    		{
    			if (principal != null && principal.Identity.IsAuthenticated)
    			{
    				ClaimsIdentity identity = principal.Identity as ClaimsIdentity;
    
    				ApplicationUser user = await userManager.FindByIdAsync(identity.Claims.FirstOrDefault(x => x.Type == ClaimTypes.NameIdentifier).Value);
    
    				if (user != null)
    				{
    					if (principal.IsInRole("Owner"))
    					{
    						var perm_all = identity.Claims.FirstOrDefault(x => x.Type == "PERMISSION:" && x.Value == PermissionsAuth.Permission_All);
    
    						if (perm_all == null)
    						{
    							identity.AddClaim(new Claim("PERMISSION:", PermissionsAuth.Permission_All, ClaimValueTypes.String, "Internal"));
    						}
    
    					}
    
    					List<Claim> claims = identity.Claims.Where(x => x.Type == "PERMISSION:").ToList();
    
    					claims.ForEach(c => identity.RemoveClaim(c));
    
    					foreach (var item in claims.ToList())
    					{
    						int count = claims.Count(x => x.Type == item.Type && x.Value == item.Value);
    						if (count == 1)
    						{
    							identity.AddClaim(item);
    						}
    					}
    
    					Claim firmClaim = identity.Claims.FirstOrDefault(x => x.Type == "FIRM");
    					var firm = JsonConvert.DeserializeObject<Firm>(firmClaim.Value);
    
    					if (firmClaim != null)
    					{
    						Claim access = identity.Claims.FirstOrDefault(x => x.Type == "PERMISSION:" && x.Value == PermissionsAuth.Permission_Access);
    
    						if (access.Value.Any())
    						{
    							if (firm.HizmetSuresi < DateTime.Now || firm.HizmetSuresi == null)
    							{
    								identity.RemoveClaim(access);
    							}
    						}
    					}
    				}
    			}
    
    			return principal;
    		}
    


    3 Aralık 2019 Salı 16:01