Добавление претензий к httpcontext в ядре asp.net (тест контроллера)

Я пытаюсь внести изменения в метод тестирования моего контроллера, используя свойство из токена, которое я использую для идентификации свойства моего контроллера. Следующие шаги

Старая ситуация:

Контроллер

      var myPropertyName = HttpContext.User.Identity!.Name;
var myProperty = _myDataRepository.GetDetailsByName(myPropertyName);

Метод испытания

      MyProperty myProperty = new()
        {
            MyLim = 1,
            MyName = "Controller Test"
        };
        wasValidOnce = false;
        myDataRepository.Setup(_ => _.GetDetailsByName(It.IsAny<string>(), false)).Returns(myProperty);
        sut.ControllerContext.HttpContext = new DefaultHttpContext
        {
            User = new GenericPrincipal(new GenericIdentity("MyTestID"), new string[] { "myRole" })
        };

После изменения мой контроллер приведен ниже:

      var id = HttpContext.User.Claims.FirstOrDefault(c => c.Type == "myid")?.Value;//myid is a property which is present in the claims
        var allItems = _myRepository.RetrieveAllItems();

        var myPropertyId = allItems.AsEnumerable().FirstOrDefault(a => a.myId.ToString().Equals(id)).foreignkeyIdColumn;

        var myProperty = _myDataRepository.GetDetailsById(myPropertyId);//GetDetailsByName and GetDetailsById give the entire table in response

Теперь мне нужно изменить метод тестирования, чтобы он работал с последними изменениями в контроллере.

Я сделал следующие изменения

      MyProperty myProperty = new()
        {
            MyLim = 1,
            MyName = "Controller Test"
        };
referenceDataRepository.Setup(_ => _.GetDetailsById(It.IsAny<int>())).Returns(myProperty);

 Guid id = Guid.NewGuid();

        sut.ControllerContext.HttpContext = new DefaultHttpContext
        {
            User = new GenericPrincipal(new GenericIdentity("MyTestID"), new string[] { "Role" }) { Claims = new List<Claim> { new Claim("myid", clientId.ToString()) } }            
        }; // but getting error in Claim: Property or indexer 'property' cannot be assigned to -- it is read only

Как добавить myid в качестве утверждений, чтобы его можно было использовать в контроллере для разрешения следующей строки кода: var id = HttpContext.User.Claims.FirstOrDefault(c => c.Type == "myid")?.Value;

1 ответ

Вот мой пример кода:

MyClaimsTransformation.cs

      using Microsoft.AspNetCore.Authentication;
using System.Security.Claims;

namespace WebApplication1
{
    public class MyClaimsTransformation : IClaimsTransformation
    {

        public Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
        {
            ClaimsIdentity claimsIdentity = new ClaimsIdentity();
            var claimType = "myNewClaim";
            claimsIdentity.AddClaim(new Claim(claimType, "myClaimValue"));
            principal.AddIdentity(claimsIdentity);
            return Task.FromResult(principal);
        }
    }

}

Вам необходимо добавить услугу

Программа.cs

      builder.Services.AddSingleton<IClaimsTransformation, MyClaimsTransformation>();

Затем вы можете получить значение от пользователей

значение передается

Для получения более подробной информации вы можете проверить это:https://learn.microsoft.com/en-us/aspnet/core/security/authentication/claims?view=aspnetcore-6.0 .

Другие вопросы по тегам