Как реализовать этот атрибут фильтра MVC? - PullRequest
0 голосов
/ 25 мая 2018

Мне нужно интегрировать новый API безопасности в несколько существующих приложений в моей организации.Некоторые приложения используют ASP.NET MVC и класс .NET AuthorizeAttribute для украшения классов с безопасностью.

Например:

[Authorize(Roles="MY_CORP\Group1,MY_CORP\Group2")]
public class MyClass
{
    //
}

Приведенный выше код основан на конфигурации аутентификации Windows.Мне нужно обновить эту реализацию, чтобы использовать новый API безопасности.Новый API безопасности будет извлекать пользователя следующим образом:

var user = new SecurityApi().GetUser(userId);
var groups = user.Groups;

Таким образом, в идеале обновленный декоратор должен выглядеть примерно так, где GroupX и GroupY существуют как пользователь. Группы, возвращаемые из API безопасности:

[Authorize(Roles="GroupX, GroupY")]
public class MyClass
{
    //
}

Есть идеи, как мне реализовать это?

1 Ответ

0 голосов
/ 26 мая 2018

Я использую что-то вроде этого:

public class RequireAuthAttribute : TypeFilterAttribute
{
    public RequireAuthAttribute(params Roles[] rolesRequirement) 
        : base(typeof(RequireAuthFilter))
    {
        Arguments = new object[] { rolesRequirement };
    }

    public enum Roles: ushort
    {
        CompanyOnly,
        AuthenticatedCustomer,
        AuthorizedCustomer,
        AuthorizedOwnerManager
    }
}

С:

public class RequireAuthFilter : IAsyncActionFilter
{
    private readonly Roles[] _rolesToAllow;

    public RequireAuthFilter(Roles[] rolesRequirement = default(Roles[]))
    {
        _rolesToAllow = rolesRequirement;
    }

    public async Task OnActionExecutionAsync(
    ActionExecutingContext context, 
    ActionExecutionDelegate next ) 
    {
        // Verify is Authenticated
        if (context.HttpContext.User.Identity.IsAuthenticated != true)
        {
            context.HttpContext.SetResponse(401, "User is not Authenticated");
            return;
        }

        var isCompanyAdmin = context.HttpContext.IsCompanyAdmin(); 
        // ^ HttpContext Extension method that looks at our JWT Token 
        // and determines if has required Cliams/Roles.

        if (isCompanyAdmin == true)
        {
            await next();
            return;
        } else {
            context.HttpContext.SetResponse(401, "Restricted to Company");
            return;
        }

        // Other custom logic for each role.
        // You will want to decide if comma represents AND or an OR 
        // when specifying roles.
    }
}

И используйте вот так:

[RequireAuth(Roles.CompanyOnly, Roles.AuthorizedOwnerManager)]
public class MyClass
{
    //
}
...