如何在 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.CurrentPrincipal
和 HttpContext.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);
}
我有一个在 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.CurrentPrincipal
和 HttpContext.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);
}