ASP.NET Core заставляет пользователя не работать при развертывании в IIS и запускать в браузере - PullRequest
0 голосов
/ 26 сентября 2019

Это не дублирующий вопрос (насколько я исследовал).Моя проблема в том, что все работает хорошо, когда я запускаю приложение ASP.NET Core 2.1 MVC в VS 2019, но когда я развертываю в локальном IIS и запускаю свое приложение в браузере, оно не работает.Моя операционная система - Windows 10.

Я включил ниже в IIS

enter image description here

Я делаюниже, чтобы получить имя пользователя, который запустил мое приложение ASP.NET Core 2.1 MVC в браузере.

В Свойства -> launchSettings.json

"windowsAuthentication": true,
 "anonymousAuthentication": false,

В Startup.cs

public void ConfigureServices(IServiceCollection services)
{
   services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
}

В Helper.cs

public static string GetUserName(IHttpContextAccessor httpContextAccessor)
{
  string userName = string.Empty;
  if(httpContextAccessor != null &&
     httpContextAccessor.HttpContext != null &&
     httpContextAccessor.HttpContext.User != null &&
     httpContextAccessor.HttpContext.User.Identity != null)
    {
        userName = httpContextAccessor.HttpContext.User.Identity.Name;
        string[] usernames = userName.Split('\\');
        userName = usernames[1].ToUpper();
    }
        return userName;
}

В MyController.cs

public class MyController : Controller
{
    private readonly IHttpContextAccessor _httpContextAccessor;

    public MyController(IHttpContextAccessor httpContextAccessor)
    {
      _httpContextAccessor = httpContextAccessor;            
    }

    [HttpPost]
    public JsonResult CreateOrder([FromBody] OrderModel model)
    {
      string username = Helper.GetUserName(_httpContextAccessor);
      .....
    }
}

Когда я запускаю свое приложение в VS 2019, все в порядке, но когда я публикую свое приложение в IIS и запускаю его в браузере, я получаю сообщение об ошибке из-за httpContextAccessor.HttpContext.User.Identity.Name null.

Я также пробовал различные способы, например FindFirst, используя утверждения, но все они хорошо работают, когда я работаю в VS 2019, но не публикую свое приложение в IIS и не запускаю его в браузере.Какую ошибку я делаю.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 27 сентября 2019

Я нашел решение.

Я сделал ниже в моем IIS.Дважды щелкните по Аутентификация.

enter image description here

enter image description here

Свойства -> launchSettings.json и web.config не устранили проблему.

В Starup.cs

public void ConfigureServices(IServiceCollection services)
{
  services.AddHttpContextAccessor();
}

In Helper.cs

public static string GetUserName(IHttpContextAccessor httpContextAccessor)
{
   string userName = string.Empty;
   if(httpContextAccessor != null &&
      httpContextAccessor.HttpContext != null &&
      httpContextAccessor.HttpContext.User != null &&
      httpContextAccessor.HttpContext.User.Identity != null)
      {
        userName = httpContextAccessor.HttpContext.User.Identity.Name;
        string[] usernames = userName.Split('\\');
        userName = usernames[1].ToUpper();
      }
      return userName;
}

В MyController.cs - я добавил метку Authorize в свой метод действия.

public class MyController : Controller
{
    private readonly IHttpContextAccessor _httpContextAccessor;

    public MyController(IHttpContextAccessor httpContextAccessor)
    {
      _httpContextAccessor = httpContextAccessor;            
    }

    [HttpPost]
    [Authorize]
    public JsonResult CreateOrder([FromBody] OrderModel model)
    {
      string username = Helper.GetUserName(_httpContextAccessor);
      .....
    }
}

Теперь он хорошо работает, когда я отлаживаюв VS 2019 и после публикации в IIS и других, вызывая мое приложение в браузере.

0 голосов
/ 26 сентября 2019

Проверка подлинности Windows должна быть включена отдельно для сайта IIS.Вероятно, вы этого не сделали, поэтому автоматическая авторизация не происходит, и, следовательно, имя пользователя имеет значение null.

При этом вам не следует вводить IHttpContextAccessor в контроллер.HttpContext уже уже доступно через HttpContext напрямую.Кроме того, ваш помощник здесь совершенно бесполезен, поскольку вы просто заменяете:

HttpContext.User.Identity.Name

на:

Helper.GetUserName(HttpContext)

На самом деле, вы можете просто использовать User.Identity.Name, так какпринципал по умолчанию хранится в свойстве User на контроллере.

...