Одата Как авторизации на $ расширить функциональность пользовательских ролей? - PullRequest
0 голосов
/ 25 апреля 2018

Я хочу ограничить доступ к операции $ expand на основе ролей.Моя проблема заключается в том, чтобы ограничить доступ к какой-либо сущности для пользователя Roles.Can кто-то дает некоторые советы о том, с чего начать?

1 Ответ

0 голосов
/ 27 апреля 2018

Вы можете выполнить АВТОРИЗАЦИЮ, используя этот фрагмент кода. Я получаю это от http://www.software -architects.com / devblog / 2014/09/12/10-OData-FAQs просто с большим количеством кода

[Authorize]
[ODataRoutePrefix("Customer")]
public class CustomerController : ODataController
{
    [...]
    [EnableQuery]
    public IHttpActionResult Get()
    {
        if (!string.IsNullOrWhiteSpace(((ClaimsPrincipal)Thread.CurrentPrincipal).Claims.FirstOrDefault(c => c.Type == "IsAdmin").Value))
        {
            return Ok(context.Customers);
        }
        return Unauthorized();
    }

    [...]
}

или метод создания расширений IEdmModelBuilder, дополнительная ссылка в

ODataAuthorizationQueryValidatorSample на git hub

using System;
using System.Linq;
using System.Reflection;
using System.Web.OData;
using Microsoft.OData.Edm;

namespace MHS.Assessments.WebAPI.Utilities
{
    public static class IEdmModelBuilderExtensions
    {
        public static void AddAuthorizedRolesAnnotations(this IEdmModel edmModel)
        {
            var typeAnnotationsMapping = edmModel.SchemaElementsAcrossModels()
                .OfType<IEdmEntityType>()
                .Where(t => edmModel.GetAnnotationValue<ClrTypeAnnotation>(t) != null)
                .Select(t => edmModel.GetAnnotationValue<ClrTypeAnnotation>(t).ClrType)
                .ToDictionary(clrType => clrType,
                              clrType => clrType.GetCustomAttributes<CanExpandAttribute>(inherit: false));

            foreach (var kvp in typeAnnotationsMapping)
            {
                foreach (var attribute in kvp.Value)
                {
                    attribute.SetRoles(edmModel, kvp.Key);
                }
            }
        }


        public static void SetAuthorizedRolesOnType(this IEdmModel model,string typeName,string[] roles)
        {
            IEdmEntityType type = model.FindType(typeName) as IEdmEntityType;
            if (type == null)
            {
                throw new InvalidOperationException("The authorized element must be an entity type");
            }

            model.SetAnnotationValue<AuthorizedRoles>(type, new AuthorizedRoles(roles));
        }
    }
}

WebApiConfig.ca

edmModel.SetAuthorizedRolesOnType("Customers", new string[] { "Support"});
...