Насколько я понимаю, если вы используете только аутентификацию Windows, вам не нужно беспокоиться о GrantResourceOwnerCredentials. Вы пытаетесь использовать аутентификацию токена, а также аутентификацию Windows? вам следует использовать аутентификацию Windows только для веб-API, который будет работать в вашей интрасети.
Простите, если я скажу то, что вы уже знаете, но из проведенного мною исследования и моей благодарности Доминику Байеру по множественному мнению вам необходимо:
- Установка пакетов nuget для Microsoft.Owin и Microsoft.Owin.Security.OAuth
- Установите для проверки подлинности Windows значение «Включено» в проекте (окно свойств F4) или в файле конфигурации
- Убедитесь, что у вас есть атрибут [Authorize] на вашем контроллере и он унаследован от ApiController
- Специально реализуйте промежуточное программное обеспечение Owin (вам нужно будет создать три класса и убедиться, что они настроены в классе startup.cs). Посмотрите на следующий код:
1-й класс Middleware: объявить функцию
public class ClaimsTransformationOptions
{
public Func<ClaimsPrincipal, Task<ClaimsPrincipal>> ClaimsTransformation { get; set; }
}
2-й класс промежуточного программного обеспечения: здесь метод Invoke
public class ClaimsTransformationMiddleware
{
readonly ClaimsTransformationOptions _options;
readonly Func<IDictionary<string, object>, Task> _next;
public ClaimsTransformationMiddleware(Func<IDictionary<string, object>, Task> next, ClaimsTransformationOptions options)
{
_next = next;
_options = options;
}
public async Task Invoke(IDictionary<string, object> env)
{
// use Katana OWIN abstractions (optional)
var context = new OwinContext(env);
if (context.Authentication != null &&
context.Authentication.User != null)
{
var transformedPrincipal = await _options.ClaimsTransformation(context.Authentication.User);
context.Authentication.User = new ClaimsPrincipal(transformedPrincipal);
}
await _next(env);
}
}
3-й класс промежуточного программного обеспечения: это дополнительный класс
public static class ClaimsTransformationMiddlewareExtensions
{
public static IAppBuilder UseClaimsTransformation(this IAppBuilder app,
Func<ClaimsPrincipal, Task<ClaimsPrincipal>> transformation)
{
return app.UseClaimsTransformation(new ClaimsTransformationOptions
{
ClaimsTransformation = transformation
});
}
public static IAppBuilder UseClaimsTransformation(this IAppBuilder app, ClaimsTransformationOptions options)
{
if (options == null)
{
throw new ArgumentNullException("options");
}
app.Use(typeof(ClaimsTransformationMiddleware), options);
return app;
}
}
В классе запуска:
public void Configuration(IAppBuilder app)
{
app.UseClaimsTransformation(Transformation);
}
private async Task<ClaimsPrincipal> Transformation(ClaimsPrincipal incoming)
{
if (!incoming.Identity.IsAuthenticated)
{
return incoming;
}
var name = incoming.Identity.Name;
// go to a datastore - find the app specific claims
var claims = new List<Claim>
{
new Claim(ClaimTypes.NameIdentifier, name),
new Claim(ClaimTypes.Role, "foo"),
new Claim(ClaimTypes.Email, "foo@foo.com")
};
var id = new ClaimsIdentity("Windows");
id.AddClaims(claims);
return new ClaimsPrincipal(id);
}
В контроллере (Убедитесь, что он имеет атрибут [Authorize] и наследуется от ApiController
public IEnumerable<ViewClaim> Get()
{
var principal = User as ClaimsPrincipal;
return from c in principal.Claims
select new ViewClaim
{
Type = c.Type,
Value = c.Value
};
}