Я могу переусердствовать, но у нас есть внутренний ASP.NET MVC5 SPA с AngularJS, использующий проверку подлинности Windows. Это приложение имеет базовую базу данных SQL, в которой есть таблица пользователей, содержащая имена своих учетных записей и их соответствующие роли в приложении. Мы будем звонить в другое приложение веб-API, которое также включает проверку подлинности Windows.
Я попытался провести исследование того, как обрабатывать авторизацию с использованием OWIN, но не смог найти каких-либо конкретных примеров, касающихся OWIN и проверки подлинности Windows. Все, что появляется, использует проверку подлинности с использованием имени пользователя и пароля.
Как я могу использовать OWIN и Windows Auth для моего приложения? Вот пример моего класса OAuthAuthorizationServerProvider.
public class SimpleAuthorizationServerProvider : OAuthAuthorizationServerProvider
{
public override async Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
{
context.Validated();
return;
}
public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });
var container = UnityHelper.GetContainerInstance("***");
var securityHelper = container.Resolve<ISecurityHelper>();
User currentUser = securityHelper.GetCurrentUser(); // Validates user based on HttpContext.Current.User
if (currentUser == null)
{
context.SetError("invalid_grant", "The user could not be found.");
return;
}
var identity = new ClaimsIdentity(context.Options.AuthenticationType);
identity.AddClaim(new Claim("sub", currentUser.AccountName));
identity.AddClaim(new Claim("role", "user"));
context.Validated(identity);
}
}
UPDATE: К сожалению, я забыл включить дополнительную информацию о том, что мы хотели бы выполнить. Если возможно, мы хотели бы использовать билеты на аутентификацию на предъявителя, поэтому нам не нужно искать пользователя и их роли каждый раз, когда мы вызываем метод web api.
ОБНОВЛЕНИЕ 2: По просьбе Андрея, ниже приведена версия TL;DR моего класса _securityHelper, в частности метод GetCurrentUser(). Вы заметите, что я пытаюсь позвонить:
HttpContext.Current.GetOwinContext().Request.User.Identity.Name
Это всегда возвращает null для пользователя.
public class SecurityHelper : ISecurityHelper
{
private readonly ISecurityGroupController _securityGroupController;
private readonly IUserController _userController;
private readonly IEmployeeController _employeeController;
private readonly IFieldPermissionController _fieldPermissionController;
private readonly IOACController _oacController;
public SecurityHelper(ISecurityGroupController securityGroupController,
IUserController userController,
IEmployeeController employeeController,
IFieldPermissionController fieldPermissionController,
IOACController oacController)
{
_securityGroupController = securityGroupController;
_userController = userController;
_employeeController = employeeController;
_fieldPermissionController = fieldPermissionController;
_oacController = oacController;
}
// ... other methods
public User GetCurrentUser()
{
User user = _userController.GetByAccountName(HttpContext.Current.GetOwinContext().Request.User.Identity.Name);
if (user != null)
{
List<OAC> memberships = _oacController.GetMemberships(user.SourceId).ToList();
if (IsTestModeEnabled() && ((user.OACMemberships != null && user.OACMemberships.Count == 0) || user.OACMemberships == null))
{
user.OACMemberships = memberships;
}
else if (!IsTestModeEnabled())
{
user.OACMemberships = memberships;
}
}
return user;
}
}