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

C# 如何在ASP.NET MVC 5中注册自定义主体类型?,c#,asp.net-mvc,asp.net-mvc-5,identity,claims,C#,Asp.net Mvc,Asp.net Mvc 5,Identity,Claims,我有一个应用程序,它是在ASP.NET MVC 5框架的顶部使用C#编写的 我希望使用MyOwnClaimsPrincipal实现,而不是使用IPrincipal接口的内置ClaimsPrincipal实现。我的MyOwnClaimsPrincipal类实现了IPrincipal接口 换句话说,我希望能够从AuthorizeAttribute类内部或作为控制器和视图中的User属性访问MyOwnClaimsPrincipal实例 下面是一个我希望能够做到的例子 public class Test

我有一个应用程序,它是在ASP.NET MVC 5框架的顶部使用C#编写的

我希望使用
MyOwnClaimsPrincipal
实现,而不是使用
IPrincipal
接口的内置
ClaimsPrincipal
实现。我的
MyOwnClaimsPrincipal
类实现了
IPrincipal
接口

换句话说,我希望能够从
AuthorizeAttribute
类内部或作为控制器和视图中的
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\u BeginRequest
方法在每个请求开始时设置
线程.CurrentPrincipal
HttpContext.Current.User
,如下所示

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

    Thread.CurrentPrincipal = user;
    HttpContext.Current.User = user;
} 
不幸的是,这没有起作用。
filterContext.HttpContext.User
仍然设置为
ClaimsPrincipal
,当我将其转换为
MyOwnClaimsPrincipal
时,返回空值

我怎样才能正确地设置我的一个实现的
IPrincipal
在应用程序中使用?

根据
应用程序_BeginRequest
是第一个事件,我认为你要迟到了

猜测一下:默认的身份验证机制似乎没有检查是否已经分配了
IPrincipal
,因此它会覆盖您的身份验证机制

我已经使用
应用程序\u 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);
}
受保护的无效应用程序\u PostAuthenticateRequest(对象发送方,EventArgs EventArgs)
{
var索赔=新列表();
添加(新的索赔(ClaimTypes.NameIdentifier,“42”);
claims.Add(新索赔(ClaimTypes.Name,“Hello World”);
var claimsIdentity=新的claimsIdentity(声明,“MyAuthenticationScheme”);
Context.User=newclaimsprincipal(claimsIdentity);
}

确实
Application\u PostAuthenticateRequest
设置了它!但是,
Application\u PostAuthenticateRequest
似乎在每个请求中至少被调用两次。我在方法中设置了一个断点,在每个请求中被调用两次。这是预期的行为?可能是第二个ajax请求还是另一个请求?@Junior