如何修复UserPrincipal从API调用返回空字符串

时间:2019-01-09 19:56:15

标签: c# angular iis asp.net-core-2.0

我有一个在Windows Server 2012上运行的.net-core 2.2应用程序,使用angular作为前端SPA。在Windows域中,我已经在IIS服务器上运行了集成的Windows身份验证,在我的网站上也运行了Windows Auth,主要问题似乎是运行AppPool的服务帐户(如果我使用我的AD凭据运行了该网站) ,该网站会返回用户名,并以正确的角度显示在前端的前端,并带有

欢迎,约翰·史密斯

当我使用由我们的安全团队创建的服务帐户运行AppPool时,网站将用户名返回为

  

“”

空字符串。我确认运行应用程序池的服务帐户确实有权访问Active Directory,但此时我仍然茫然不知所措。

  1. 我已经使用我的AD帐户运行AppPool,并且站点运行正常。 (有效)
  2. 我已经使用服务帐户运行AppPool,并且该站点未正确返回UserPrincipal。 (断)
  3. 我已经确认通过将AD用户和组作为服务帐户运行,服务帐户可以读入Active Directory(有效)

API控制器:

```


#region Get the logged in user
        [HttpGet("api/getLoggedInUserObject")] 
        public async Task<ActionResult> CheckForLoggedInUser()
        {
            try
            {
                var user = await userResolverSerivce.GetUserObject();

                return Ok(user);
            }
            catch (Exception ex)
            {
                Debug.Write(ex.InnerException.ToString());
                throw new Exception("User is not logged in");

            }

        }
        #endregion

```

用户主要回购

```

    public class UserResolver : IUserResolver
        {


            private AuthorizedGroups AuthorizedGroups { get; set; }
            private User _user { get; set; }


            public UserResolver(IOptions<AuthorizedGroups> authorizedGroups, User user)
            {
                AuthorizedGroups = authorizedGroups.Value;
                _user = user;

            }


            public Task<User> GetUserObject()
            {

                _user.FirstName = UserPrincipal.Current.GivenName;
                _user.LastName = UserPrincipal.Current.Surname;
                _user.FullName = $"{_user.FirstName} {_user.LastName}";
                _user.AuthorizedRoles = GetAuthorizedRoles();


                return Task.FromResult(_user);

            }

```

角度HTML:

```

    <div>
      <nav class="navbar-dark nav-bar-large bg-dark fixed-top">
        <span class="pull-right userHighlight">Welcome, {{data.userData.fullName}}</span>
        <div class="container" id="navbarNav">

          <img class="image-center" src="../../assets/img/logo_sm.png" />

        </div>
      </nav>
    </div>

```

角度TS:

```

    import { Component, OnInit, ViewEncapsulation } from '@angular/core';
    import { UserService } from '../services/user.service';
    import { User } from '../models/user';
    import { ActivatedRoute } from '@angular/router';

    @Component({
      selector: 'app-main-container',
      templateUrl: './main-container.component.html',
      styleUrls: ['./main-container.component.css'],
      encapsulation: ViewEncapsulation.None
    })
    export class MainContainerComponent implements OnInit {

      private data: any;
      private user: User[];

      constructor(private route: ActivatedRoute) { }

      ngOnInit() {
        this.data = this.route.snapshot.data;
        console.log(this.route.snapshot.data);
      }



    }

```

预期输出应返回服务帐户下的用户名,而不是一个空字符串,我一直在想为什么一个服务帐户有效而另一个服务帐户无效。控制台中没有错误。

1 个答案:

答案 0 :(得分:1)

您需要的是获取呼叫者的身份,并且假设您在使用Windows身份验证时应该获取它。

但是.Net核心API不支持模拟。解决方法是使用以下代码获取用户名

文档:https://docs.microsoft.com/en-us/aspnet/core/security/authentication/windowsauth?tabs=visual-studio&view=aspnetcore-2.2#impersonation

下面的代码可能会帮助您:

from scipy.ndimage.interpolation import shift

def shift_image(image, dx, dy):
    image = image.reshape((28, 28))
    shifted_image = shift(image, [dy, dx], cval=0, mode="constant")
    return shifted_image.reshape([-1])