我们正在将.NET 4x从.NET Core切换到.NET Core,现在我在身份验证方面遇到了问题。
主要问题是,身份验证在程序集中,对于Core我还是很陌生,但请仔细阅读。发生了一些问题,例如IPrincipal。
因此,我创建了中间件并将其注册到StartUp.cs中。之后,我将其调用以启动身份验证过程。
在.NET中,我使用了以下方法:
protected void Application_AuthenticateRequest(object sender, EventArgs e)
{
NameValueCollection header = new NameValueCollection();
header.Add(Request.Headers);
IPrincipal princ = new CompanyPortalPrincipal(header);
Context.User = princ;
CompanyPortalPrincipal pp = Context.User as CompanyPortalPrincipal;
...
在Core中,我不能使用它。
首先,我的分子量:
private void BeginInvoke(HttpContext context)
{
NameValueCollection header = new NameValueCollection();
header.Add(context.Request.Headers);
IPrincipal principal = new CompanyPortalPrincipal(header);
context.User = principal;
...
第一个问题出在header.Add(context.Request.Headers);
中,因为它说它无法从Microsoft.AspNetCore.Http.IHeaderDictionary
转换为Collection.Specialized.NameValueCollection
。
第二个问题是在Core中您使用的是类似ClaimsPrincipal
的东西吗?我不能使用它,因为不允许我触摸CompanyPortalPrincipal,并且正在使用IPrincipal。因此,我无法执行context.User
,因为简而言之,它无法从IPrincipal
转换为ClaimsPrincipal
答案 0 :(得分:1)
第一个问题是在header.Add(context.Request.Headers);中。因为它说它不能从Microsoft.AspNetCore.Http.IHeaderDictionary转换为Collection.Specialized.NameValueCollection。
ASP.NET Core现在使用IHeaderDictionary
存储标头。您可以通过以下方式将IHeaderDictionary
转换为NameValueCollection
:
NameValueCollection header = ctx.Request.Headers
.SelectMany( kvp => kvp.Value, (kvp, value) => (kvp.Key,value))
.Aggregate( new NameValueCollection(), (seed, current) =>{
seed.Add(current.Key,current.value);
return seed;
});
// now you get the header
IPrincipal principal = new CompanyPortalPrincipal(header);
第二个问题是在Core中使用的是ClaimsPrincipal之类的东西?我不能使用它,因为不允许我触摸CompanyPortalPrincipal,并且正在使用IPrincipal。因此,我无法执行context.User,因为总之它无法从IPrincipal转换为ClaimsPrincipal
不确定CompanyPortalPrincipal
的定义。但是ClaimsPrincipal
constructor接受参数IIdentity
,因此您可以如下创建新的ClaimsPrincipal
:
var userPrincipal = new ClaimsPrincipal(principal.Identity);
// if you have multiple identity, invoke :
// ... userPrincipal.AddIdentity(...)
context.User = principal;
ClaimsPrincipal
(source)或ClaimsIdentity
(source)中没有魔术。您可以根据需要修改主体,例如,添加声明添加标识。