context.Request.User является нулевым в OWIN OAuthAuthorizationServerProvider

Я пытаюсь реализовать OAuth, используя OWIN для конечной точки Web API v2 в моей локальной интрасети. API размещается в IIS с использованием встроенной аутентификации Windows. Одним словом, это то, чего я хочу.

Когда я прошу мой токен в / токен

Вытащить WindowsPrincipal из контекста OWIN

Используйте идентификатор безопасности из WindowsPrincipal, чтобы найти некоторые роли для этого пользователя в таблице SQL.

Создайте новый ClaimsIdentity, в котором хранятся имя пользователя и роли

Превратите это в веб-токен Json (JWT), который я отправил

Когда я запрашиваю ресурс у моего API, используя мой токен

Преобразовать токен на предъявителя JWT обратно в ClaimsIdentity

Используйте этот ClaimsIdentity для авторизации запросов к ресурсу по ролям.

Таким образом, мне не нужно выполнять поиск в базе данных для пользовательских ролей по каждому запросу. Это просто запекается в JWT.

Я думаю, что я все настраиваю правильно. Мой метод Startup.Configuration выглядит следующим образом.

public void Configuration(IAppBuilder app)
{

    // token generation
    // This is what drives the action when a client connects to the /token route
    app.UseOAuthAuthorizationServer(new OAuthAuthorizationServerOptions
    {
        // for demo purposes
        AllowInsecureHttp = true,

        TokenEndpointPath = new PathString("/token"),
        AccessTokenExpireTimeSpan = TimeSpan.FromHours(8),
        AccessTokenFormat = GetMyJwtTokenFormat(),
        Provider = new MyAuthorizationServerProvider()
    });



    //// token consumption
    app.UseOAuthBearerAuthentication(
        new OAuthBearerAuthenticationOptions()
        {
            Realm = "http://www.ccl.org",
            Provider = new OAuthBearerAuthenticationProvider(),
            AccessTokenFormat = GetMyJwtTokenFormat()
        }
    );


    app.UseWebApi(WebApiConfig.Register());

}

MyAuthorizationServerProvider выглядит следующим образом ...

    public class MyAuthorizationServerProvider : OAuthAuthorizationServerProvider
    {

        public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
        {

            // Since I'm hosting in IIS with Windows Auth enabled
            // I'm expecting my WindowsPrincipal to be here, but it's null  :(
            var windowsPrincipal = context.OwinContext.Request.User.Identity;

            // windowsPrincipal is null here.  Why?

            // Call SQL to get roles for this user

            // create the identity with the roles
            var id = new ClaimsIdentity(stuff, more stuff);

            context.Validated(id);
        }
    }

Моя проблема в том, что context.Request.User здесь пусто. Я не могу добраться до своего WindowsPrincipal. Если я создам какое-то другое фиктивное промежуточное программное обеспечение, я могу без проблем добраться до WindowsPrincipal. Почему это нуль в этом контексте? Я делаю что-то неправильно?

Ответы на вопрос(1)

Ваш ответ на вопрос