gpt4 book ai didi

c# - 如何在 ASP.NET MVC 5 中注册自定义主体类型?

转载 作者:太空宇宙 更新时间:2023-11-03 11:58:23 24 4
gpt4 key购买 nike

我有一个在 ASP.NET MVC 5 框架之上使用 C# 编写的应用程序。

我不想使用 IPrincipal 接口(interface)的内置 ClaimsPrincipal 实现,而是想使用 MyOwnClaimsPrincipal 实现。我的 MyOwnClaimsPrincipal 类实现了 IPrincipal 接口(interface)。

换句话说,我希望能够从 AuthorizeAttribute 类内部或作为 Controller 中的 User 属性访问 MyOwnClaimsPrincipal 实例和观点。

这是我想做的事的例子

public class TestAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
// This does not work
MyOwnClaimsPrincipal user1 = filterContext.HttpContext.User as MyOwnClaimsPrincipal;

// Yet, this works which tells me that my mplementation is not being used
ClaimsPrincipal user2 = filterContext.HttpContext.User as ClaimsPrincipal;

}
}

我尝试利用 Global.asax.cs 中的 Application_BeginRequest 方法来设置 Thread.CurrentPrincipalHttpContext.Current .User 在每个请求的开头,像这样

public void Application_BeginRequest()
{
var user = new MyOwnClaimsPrincipal();//...

Thread.CurrentPrincipal = user;
HttpContext.Current.User = user;
}

不幸的是,这没有用。 filterContext.HttpContext.User 仍设置为 ClaimsPrincipal,当我将其转换为 MyOwnClaimsPrincipal 时返回 null。

如何正确设置要在应用程序中使用的 IPrincipal 的一个实现?

最佳答案

我认为你迟到了 according to this article Application_BeginRequest 是第一个事件。

只是猜测:似乎默认的身份验证机制没有检查是否已经分配了一个 IPrincipal,所以它覆盖了你的。

我使用 Application_PostAuthenticateRequest 处理程序做了同样的事情,它工作正常:

protected void Application_PostAuthenticateRequest(object sender, EventArgs eventArgs)
{
var claims = new List<Claim>();
claims.Add(new Claim(ClaimTypes.NameIdentifier, "42");
claims.Add(new Claim(ClaimTypes.Name, "Hello World"));
var claimsIdentity = new ClaimsIdentity(claims, "MylAuthentificationSheme");
Context.User = new ClaimsPrincipal(claimsIdentity);
}

关于c# - 如何在 ASP.NET MVC 5 中注册自定义主体类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58348594/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com