Ссылка на тип «IAuthorizeData» утверждает, что она определена в «Microsoft.AspNetCore.Authorization», но не может быть найдена - PullRequest
0 голосов
/ 04 ноября 2019

У меня есть приложение Asp.Net Core 2.2. При переходе на Asp.Net Core 3.0 появляется следующее сообщение об ошибке:

Ссылка на тип «IAuthorizeData» утверждает, что он определен в «Microsoft.AspNetCore.Authorization», но не можетбыть найденным

Я использую пакет TagHelperSamples.Authorization nuget для дополнительной визуализации части HTML на основе прав и ролей пользователя.

Я использую помощники тегов asp-authorize извышеуказанный пакет nuget для отображения меню, если пользователь авторизован, как показано ниже:

<div asp-authorize class="collapse navbar-collapse" id="navbarCollapse">

Эти помощники по тегам создают ошибку при построении проекта.

Я пытался добавить @using Microsoft.AspNetCore.Authorization в _ViewImports.cshtml, но это не сработало.

Есть ли какие-нибудь подсказки / предложения о том, как исправить это или какие-либо обходные пути?

Ответы [ 2 ]

0 голосов
/ 14 ноября 2019

Я обновил пакет TagHelperSamples.Authorization для поддержки ASP.NET Core 3.0. Обновление до последней версии пакета решит вашу проблему: https://www.nuget.org/packages/TagHelperSamples.Authorization/

0 голосов
/ 05 ноября 2019

TagHelperSamples.Authorization пока не подходит для asp.net core 3.0, см.

https://github.com/dpaquette/TagHelperSamples/issues/77

Вы можете просто удалить пакет и вручную создать свой вспомогательный класс для тегов авторизации на основена исходный код в проекте asp.net core 3.0:

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Authorization.Policy;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Razor.TagHelpers;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace Asp3identityCore.TagHelpers
{
    [HtmlTargetElement(Attributes = "asp-authorize")]
    [HtmlTargetElement(Attributes = "asp-authorize,asp-policy")]
    [HtmlTargetElement(Attributes = "asp-authorize,asp-roles")]
    [HtmlTargetElement(Attributes = "asp-authorize,asp-authentication-schemes")]
    public class AuthorizationPolicyTagHelper : TagHelper, IAuthorizeData
    {
        private readonly IAuthorizationPolicyProvider _policyProvider;
        private readonly IPolicyEvaluator _policyEvaluator;
        private readonly IHttpContextAccessor _httpContextAccessor;

        public AuthorizationPolicyTagHelper(IHttpContextAccessor httpContextAccessor, IAuthorizationPolicyProvider policyProvider, IPolicyEvaluator policyEvaluator)
        {
            _httpContextAccessor = httpContextAccessor;
            _policyProvider = policyProvider;
            _policyEvaluator = policyEvaluator;
        }

        /// <summary>
        /// Gets or sets the policy name that determines access to the HTML block.
        /// </summary>
        [HtmlAttributeName("asp-policy")]
        public string Policy { get; set; }

        /// <summary>
        /// Gets or sets a comma delimited list of roles that are allowed to access the HTML  block.
        /// </summary>
        [HtmlAttributeName("asp-roles")]
        public string Roles { get; set; }

        /// <summary>
        /// Gets or sets a comma delimited list of schemes from which user information is constructed.
        /// </summary>
        [HtmlAttributeName("asp-authentication-schemes")]
        public string AuthenticationSchemes { get; set; }

        public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
        {
            var policy = await AuthorizationPolicy.CombineAsync(_policyProvider, new[] { this });

            var authenticateResult = await _policyEvaluator.AuthenticateAsync(policy, _httpContextAccessor.HttpContext);

            var authorizeResult = await _policyEvaluator.AuthorizeAsync(policy, authenticateResult, _httpContextAccessor.HttpContext, null);

            if (!authorizeResult.Succeeded)
            {
                output.SuppressOutput();
            }
        }
    }
}
...