c# - 如何在 ASP.NET MVC 5 中注册自定义主体类型?
问题描述
我有一个在 ASP.NET MVC 5 框架之上使用 C# 编写的应用程序。
我不想使用接口的内置ClaimsPrincipal
实现,而是使用实现。我的类实现了接口。IPrincipal
MyOwnClaimsPrincipal
MyOwnClaimsPrincipal
IPrincipal
换句话说,我希望能够MyOwnClaimsPrincipal
从AuthorizeAttribute
类内部或作为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.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
要在应用程序中使用的一种实现?
解决方案
我想你是 按这篇文章 Application_BeginRequest
来晚了是第一个事件。
只是猜测:似乎默认的身份验证机制没有检查是否已经IPrincipal
分配了一个,所以它会覆盖你的。
我使用Application_PostAuthenticateRequest
Handler 做了同样的事情,它工作正常:
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);
}
推荐阅读
- python - 当我在 python3 中使用 readline 函数时,无法将变量存储到新变量中
- mongodb - 我无法通过使用纬度和经度来获取记录,使用 Mongodb
- c# - 使用 OpenCV 连续捕获桌面循环
- nuget - TeamCity 在应该发布 4 时仅将 1 个包发布到 NuGet 提要
- c# - 如何让安装程序注册一个 IE 插件
- teamcity - 停止 TeamCity 从更新命令行的程序中捕获许多日志行
- c# - 是否有使用国家/地区名称从 UTC 时间转换为本地时间的功能?
- excel-formula - Excel #REF!将工作公式应用于外部文件时出错
- c++ - 使用 Qt 5.11 和 Crypto++ 在 QtCreator 中检测到“RuntimeLibrary”不匹配
- java - 我无法使用 for 循环访问数组的索引,但我可以手动完成