Как получить WindowsPrincipal при размещении OWIN/Katana внутри IIS?

Я пытаюсь запустить приложение OWIN/Katana, размещенное на IIS, с проверкой подлинности Windows, но независимо от того, что я делаю, я всегда получаю только GenericPrincipal, который не прошел проверку подлинности, а не соответствующий WindowsPrincipal.

My Startup.cs:

public partial class Startup
{
    public void Configuration(IAppBuilder app)
    {
        var config = new HttpConfiguration();
        WebApiConfig.Register(config);
        app.UseWebApi(config);
    }
}

Мой контроллер:

public class TestController : ApiController
{
    [Authorize]
    public string Get()
    {
        return "Test";
    }
}

После просмотра запросов и отладки кода кажется, что проверка подлинности NTLM проходит успешно, но когда она достигает WebAPI, субъект не проходит проверку подлинности, поэтому он возвращает 401, заставляя IIS снова попытаться выполнить проверку подлинности Windows.

Фрагмент Web.config:

<system.web>
<authentication mode="Windows" />
<compilation debug="true" targetFramework="4.5" />
<httpRuntime targetFramework="4.5" />

Update

Похоже, что WindowsPrincipal превращает его в фиктивное ПО промежуточного слоя, которое я добавил, но не в сам WebApi. Похоже, Katana в какой-то момент меняет принципала.


person ChrisPatrick    schedule 22.04.2015    source источник
comment
Покажи нам часть web.config   -  person Dryadwoods    schedule 22.04.2015
comment
Конкретно какая-то часть?   -  person ChrisPatrick    schedule 22.04.2015
comment
У вас должно быть что-то вроде: ‹system.web› ‹авторизация› ‹deny users=?/› ‹/authorization› ‹режим аутентификации=Windows /› Я прав?   -  person Dryadwoods    schedule 22.04.2015
comment
Добавлена ​​часть web.config.   -  person ChrisPatrick    schedule 22.04.2015


Ответы (2)


Попробуйте бросить объект:

    using System.Security.Principal;

    public ActionResult Get()
    {
        var identity = this.User.Identity as WindowsIdentity;

         if (identity != null)
        {

            var data = new WindowsUserInformation { 
                          Name = identity.Name, 
                          AccountDomainSid = identity.User.AccountDomainSid.Value, 
                          CreationDate = DateTime.UtcNow 
         };

Скажите мне, если эта строка дает вам правильную личность и если данные верны... если это не так, то у вас есть какая-то другая проблема во время аутентификации....

person Dryadwoods    schedule 22.04.2015
comment
Я уже пробовал это. Identity — это GenericIdentity, не прошедший проверку подлинности, а не WindowsIdentity. - person ChrisPatrick; 22.04.2015

У меня была эта проблема, и в моем случае это было связано с <authentication mode="None"/>, находящимся в Web.config. После того, как я удалил это, все заработало отлично — OWIN вернул WindowsIdentity вместо GenericIdentity.

person r590    schedule 16.05.2017