дескриптор не авторизован для политики подключения OpenID? - PullRequest
0 голосов
/ 05 июля 2019

Я следую этой вики Быстрый старт: добавление входа с помощью Microsoft в веб-приложение ASP.NET Core

У меня есть такая политика:

services.AddAuthorization(options =>
{
    options.AddPolicy("CanAccessAdminGroup",
        policyBuilder => policyBuilder.RequireClaim("groups", "Guid"));
});

Мой контроллер имеет [Authorize(Policy = "CanAccessAdminGroup")]

, что нормально работает, когда пользователь входит в эту группу AAD.Но когда пользователь не в группе, меня отправляют на xxx/Account/AccessDenied?returnurl=xx

Как изменить перенаправление на использование другого контроллера / действия, например /identity/index?

Я пытался это сделатьно не сработало:

OnAuthenticationFailed = context =>
{
    context.Response.Redirect("Identity/Index");
    context.HandleResponse(); // Suppress the exception
    return Task.CompletedTask;

Это вывод из окна «Отладка»:

Microsoft.AspNetCore.Authorization.DefaultAuthorizationService: Информация: авторизация не удалась.Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker: Информация: авторизация не выполнена для запроса в фильтре «Microsoft.AspNetCore.Mvc.Authorization.AuthorizeFilter».Microsoft.AspNetCore.Mvc.ForbidResult: Информация: выполнение ForbidResult со схемами аутентификации ().Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationHandler: Информация: Схема аутентификации: AzureADCookie был запрещен.

1 Ответ

1 голос
/ 08 июля 2019

Сначала вы можете создать требование авторизации:

public class MatchGroupRequirement : IAuthorizationRequirement
{
    public String  GroupID { get; }

    public MatchGroupRequirement(string groupID)
    {
        GroupID = groupID;
    }
}

Создайте обработчик авторизации, который отвечает за оценку свойств требования, в пользовательской авторизации вы можете перенаправить на любое желаемое действие контроллера, используя AuthorizationFilterContext и RedirectToActionResult:

public class MatchGroupHandler : AuthorizationHandler<MatchGroupRequirement>
{
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context,
                                                    MatchGroupRequirement requirement)
    {
        var redirectContext = context.Resource as AuthorizationFilterContext;
        var groups = context.User.Claims.Where(c => c.Type == "groups").ToList();
            var matchingvalues = groups.Where(stringToCheck => stringToCheck.Value.Contains(requirement.GroupID)).FirstOrDefault();
        //check the condition 
        if (matchingvalues == null)
        {
            redirectContext.Result = new RedirectToActionResult("identity", "index", null);
            context.Succeed(requirement);
            return Task.CompletedTask;
        }
        context.Succeed(requirement);
        return Task.CompletedTask;
    }
}

Политика и регистрация обработчика:

services.AddAuthorization(options =>
{
    options.AddPolicy("MatchGroup", policy =>
        policy.Requirements.Add(new MatchGroupRequirement("ddf1ad17-5052-46ba-944a-7da1d51470b0")));
});

services.AddSingleton<IAuthorizationHandler, MatchGroupHandler>();

Применение политик к контроллерам MVC / Действия:

[Authorize(Policy = "MatchGroup")]
public IActionResult Contact()
{
    ViewData["Message"] = "Your contact page.";

    return View();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...