ASP.NET CORE基类不适用于承载IIS服务器上的某些用户



在我的ASP.NET CORE MVC项目中,所有应用程序控制器都继承自一个基类,该基类具有一些公共属性和每个派生类都将实现的方法。奇怪的是,只有某些用户(而不是所有用户(会出现以下错误。执行时,等待next((上的代码出错。该代码在我使用IISExpress或Kestrel的开发工作站上运行良好。有人知道为什么吗?

o   MyProject.Controllers.BaseController.OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) in BaseController.cs
o   Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeInnerFilterAsync>g__Awaited|13_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, object state, bool isCompleted)
o   Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextResourceFilter>g__Awaited|24_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, object state, bool isCompleted)
o   Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResourceExecutedContextSealed context)
o   Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Next(ref State next, ref Scope scope, ref object state, ref bool isCompleted)
o   Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeFilterPipelineAsync>g__Awaited|19_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, object state, bool isCompleted)
o   Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
o   Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
o   Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
o   Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
o   Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)
•

这是基本类

using System;
using System.Linq;
using System.Security.Claims;
using System.Security.Principal;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.Logging;
using MyProject.Models;
using MyProject_Model_CORELibrary;
using MyProject_Repository_CORELibrary.Contracts;
namespace MyProject.Controllers
{
public abstract class BaseController : Controller
{
protected MyProjectContext RepositoryContext { get; set; }
protected readonly ILogger _logger;
protected IRepositoryAggregate _repoAggregate;
protected int _currentFY;
protected UserProfile _userProfile;
protected readonly UserManager<CustomIdentityUser> _userManager;
protected readonly SignInManager<CustomIdentityUser> _signInManager;
public BaseController(MyProjectContext repositoryContext, ILogger logger, IRepositoryAggregate repoAggregate, UserManager<CustomIdentityUser> userManager, SignInManager<CustomIdentityUser> signInManager)
{
this.RepositoryContext = repositoryContext;
_logger = logger;
_repoAggregate = repoAggregate;
_userManager = userManager;
_signInManager = signInManager;
int currentYear = DateTime.Today.Year;
if (DateTime.Today >= new DateTime(currentYear - 1, 10, 1) && DateTime.Today < new DateTime(currentYear, 10, 1))
_currentFY = DateTime.Today.Year;
else
_currentFY = DateTime.Today.Year + 1;
_userProfile = new UserProfile();
}
public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
VUserMapping thisStaff = null;
//get user id from CORE UserManager
ClaimsPrincipal principal = this.User;
if (_signInManager.IsSignedIn(principal))
{
CustomIdentityUser customIdentityUser = await _userManager.GetUserAsync(principal);
if (this.User != null && this.User.Claims.Count() != 0)
{
_userProfile.LastName = customIdentityUser.LastName.ToUpper();
_userProfile.FirstName = customIdentityUser.FirstName.ToUpper();
_userProfile.NetworkName = customIdentityUser.NetworkID.ToUpper();
if (_userProfile.NetworkName.IndexOf('\') != -1)
{
_userProfile.NetworkName = _userProfile.NetworkName.Split('\')[1];
}
thisStaff = _repoAggregate.VUserMapping_Repository
.FindByCondition(x => x.StaffNetworkId == _userProfile.NetworkName).FirstOrDefault();
_userProfile.UserID = thisStaff.StaffStaffId;
}
}
ViewData["Principal"] = this.User.Identities.ToString();
ViewData["UserName"] = string.Format("{0} {1}", _userProfile.FirstName, _userProfile.LastName);
ViewData["UserID"] = _userProfile.UserID;
ViewData["FY"] = _currentFY;
await next();
}
}
}

@Ivan Vargas感谢您指出空检查。我在代码中有个拼写错误。相反,它应该如下所示

if (_signInManager.IsSignedIn(principal))
{
CustomIdentityUser customIdentityUser = await _userManager.GetUserAsync(principal);
if (customIdentityUser != null && customIdentityUser.Claims.Count() != 0)
{
_userProfile.LastName = customIdentityUser.LastName?.ToUpper();
_userProfile.FirstName = customIdentityUser.FirstName?.ToUpper();
_userProfile.NetworkName = customIdentityUser.NetworkID?.ToUpper();

我在startup.cs中有以下服务,它可以防止检测到用户的Windows标识。奇怪的是,无论AutomaticAuthentication是打开还是关闭,在主机IIS服务器环境中,用户Windows Identity始终为null,即使我注入了IHttpContextAccessor并试图从HttpContext获取它。当我完全去掉那条线时,一切都正常了。

//services.Configure<IISServerOptions>(options => { options.AutomaticAuthentication = false; });

当我将项目发布到IIS服务器时,用户主体会形成此表单。用户始终为null。

最新更新