将应用程序身份验证升级到Core 2.0 +

时间:2019-06-04 17:32:26

标签: c# authentication asp.net-core asp.net-core-mvc

我们正在将.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

1 个答案:

答案 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;

ClaimsPrincipalsource)或ClaimsIdentitysource)中没有魔术。您可以根据需要修改主体,例如,添加声明添加标识。