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. Почему это нуль в этом контексте? Я делаю что-то неправильно?