我正在尝试使用令牌中的属性来更改我的控制器测试方法,我用该属性来识别控制器后续步骤的属性
旧情况:
控制器
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;
这是我的代码示例:
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”