在asp.net core中向httpcontext添加声明(控制器测试)

问题描述 投票:0回答:1

我正在尝试使用令牌中的属性来更改我的控制器测试方法,我用该属性来识别控制器后续步骤的属性

旧情况:

控制器

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;

asp.net-core .net-6.0 claims genericprincipal
1个回答
0
投票

这是我的代码示例:

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>();

然后您就可以从用户处获取您的“myid”

the value is passed

© www.soinside.com 2019 - 2024. All rights reserved.