C# 如何在ASP.NET MVC 5中注册自定义主体类型?
我有一个应用程序,它是在ASP.NET MVC 5框架的顶部使用C#编写的 我希望使用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
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