如何在 ASP.NET MVC 5 中注册自定义 Principal 类型?

How can I register a custom Principal type in ASP.NET MVC 5?

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

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

换句话说,我希望能够从 AuthorizeAttribute class 内部或 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 的一种实现?

我觉得你来晚了 根据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);
}