首页 > 解决方案 > 如何在 ASP.NET MVC 5 中注册自定义主体类型?

问题描述

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

我不想使用接口的内置ClaimsPrincipal实现,而是使用实现。我的类实现了接口。IPrincipalMyOwnClaimsPrincipalMyOwnClaimsPrincipalIPrincipal

换句话说,我希望能够MyOwnClaimsPrincipalAuthorizeAttribute类内部或作为User控制器和视图中的属性访问实例。

这是我想要做的一个例子

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;

    }
}

我尝试在每个请求的开头使用Application_BeginRequest方法Global.asax.cs来设置Thread.CurrentPrincipalHttpContext.Current.User

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

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

不幸的是,这并没有奏效。filterContext.HttpContext.User仍然设置为并且当ClaimsPrincipal我将其转换为MyOwnClaimsPrincipalnull 时返回。

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

标签: c#asp.net-mvcasp.net-mvc-5identityclaims

解决方案


我想你是 这篇文章 Application_BeginRequest来晚了是第一个事件。

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

我使用Application_PostAuthenticateRequestHandler 做了同样的事情,它工作正常:

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

推荐阅读