. NET Core 3.0: получение ошибки приведения типа при попытке получить значения параметров с помощью .Value - PullRequest
0 голосов
/ 16 февраля 2020

У меня есть следующий фрагмент кода, где я получаю параметры JWT, установленные в StartUp.cs.

Сначала здесь я устанавливаю TokenOptions в StartUp.cs в методе ConfigureServices:

// Get jwt options from app settings
var tokenOptions = _configuration.GetSection("Authentication").Get<JwtTokenOptions>();

services.AddAuthentication(x => {
            x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
        }).AddJwtBearer(options => {
            options.TokenValidationParameters = new TokenValidationParameters {
                ValidateIssuer = true,
                ValidateAudience = true,
                ValidateLifetime = true,
                ValidateIssuerSigningKey = true,
                RequireExpirationTime = true,
                ValidIssuer = tokenOptions.Issuer,
                ValidAudience = tokenOptions.Audience,
                IssuerSigningKey = new SymmetricSecurityKey(
                    Encoding.UTF8.GetBytes(tokenOptions.SigningKey)),
                ClockSkew = TimeSpan.Zero
            };
});

Это работает, я думаю, и я установил параметры там.

Теперь я хочу использовать эти параметры в классе, используя внедрение зависимостей:

using JobsLedger.AUTHORISATION.Interfaces;
using JobsLedger.CATALOG.ENTITIES;
using JobsLedger.CATALOG.Repositories.Interfaces;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IdentityModel.Tokens.Jwt;
using System.Linq;
using System.Reflection;
using System.Resources;
using System.Security.Claims;
using System.Security.Principal;
using System.Threading.Tasks;
using Microsoft.Extensions.Options;
using Microsoft.AspNetCore.Identity;

namespace JobsLedger.AUTHORISATION
{
    public class UserAuthorisationServices : IUserAuthorisationServices
    {
        #region Variables
        private readonly IUserCATALOGRepository _userCATALOGRepository;
        private readonly IRoleCATALOGRepository _roleCATALOGRepository;
        private readonly ICryptoService _cryptoService;
        IOptions<TokenOptions> _tokenOptions;
        #endregion

        public UserAuthorisationServices(IUserCATALOGRepository userCATALOGRepository,
                            IRoleCATALOGRepository roleCATALOGRepository,
                            ICryptoService cryptoService,
                            IOptions<TokenOptions> tokenOptions)
        {
            _userCATALOGRepository = userCATALOGRepository;
            _roleCATALOGRepository = roleCATALOGRepository;
            _cryptoService = cryptoService;
            _tokenOptions = tokenOptions.Value;
        }

Проблема в том, .. Я получаю сообщение об ошибке типа в этой строке:

_tokenOptions = tokenOptions.Value;

и ошибка:

Ошибка CS0266 Не удается неявно преобразовать тип 'Microsoft.AspNetCore.Identity.TokenOptions' в Microsoft.Extensions.Options.IOptions. Существует явное преобразование (вам не хватает приведения?)

Так что это не удается, несмотря на то, что я использую IOptions<TokenOptions> в обоих случаях.

Что я делаю неправильно и что мне нужно сделать, чтобы это исправить?

1 Ответ

0 голосов
/ 16 февраля 2020

Вы пытаетесь использовать свойство .Value внутри IOptions<T>, которое имеет тип T, для установки члена в вашем классе типа IOptions<T>. Поскольку IOptions<T> не является T, вы получаете сообщение об ошибке.

Вы можете либо изменить элемент

IOptions<TokenOptions> _tokenOptions;

на

TokenOptions _tokenOptions;

, либо изменить в пределах ваш конструктор

_tokenOptions = tokenOptions.Value;

до

_tokenOptions = tokenOptions;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...