Mogę być zbyt skomplikowana, ale mamy wewnętrzne ASP.NET MVC5 SPA z AngularJS przy użyciu uwierzytelniania Windows. Ta aplikacja ma bazę danych SQL back-end, która ma tabelę użytkowników, zawierającą nazwy ich kont i ich odpowiednie role w aplikacji. Będziemy nawiązywać połączenia z inną aplikacją Web API, która ma również włączone uwierzytelnianie systemu Windows.Aplikacja ASP.NET MVC5/AngularJS/Web API korzystająca z uwierzytelniania systemu Windows i OWIN
Próbowałem przeprowadzić badania dotyczące obsługi autoryzacji za pomocą OWIN, ale nie znalazłem konkretnych przykładów dotyczących uwierzytelniania OWIN i Windows. Wszystko, co się pojawi, wykorzystuje uwierzytelnianie za pomocą nazwy użytkownika i hasła.
Jak mogę korzystać z OWIN i Windows Auth dla mojej aplikacji? Oto przykład mojej klasy 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: Ups, zapomniałem podać więcej informacji na temat tego, co chcemy osiągnąć. Jeśli to możliwe, chcielibyśmy użyć biletów uwierzytelniających na okaziciela, abyśmy nie musieli wyszukiwać użytkownika i jego ról za każdym razem, gdy nawiążemy połączenie z metodą api web.
UPDATE 2: Na wniosek Andrzeja, poniżej jest wersja TLDR mojej klasie _securityHelper, a konkretnie sposobu GetCurrentUser(). Zauważysz, że ja próbuje zadzwonić:
HttpContext.Current.GetOwinContext().Request.User.Identity.Name
To zawsze wraca zerowy dla Użytkownika.
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;
}
}
Dzięki Andrew. To właśnie seria artykułów zapoczątkowała moją drogę i chciałbym ją zrealizować. Mam to wszystko na miejscu, ale gdy próbuję uzyskać HttpContext.Current.User w moim SimpleAuthorizationServerProvider.GrantResourceOwnerCredentials, to jest null i nie mogę uzyskać głównego. Ustawiam atrybut grantu na "hasło", tak jak poleca artykuł, ale nie mogę uzyskać zleceniodawcy. – mmoreno79
czy możesz wysłać kod z klasy 'SecurityHelper'? – Claies
Po wypróbowaniu kilku rzeczy okazuje się, że moje wdrożenie serii artykułów, które pierwotnie sugerował Andrew, naprawdę działało. "Przeszkoda", którą próbowałem przejść, polegała na tym, że otrzymałem główną nazwę użytkownika z HttpContext.Current.GetOwinContext(). Request.User. To zwracało wartość ** null ** w mojej metodzie GetCurrentUser(). Cóż, okazało się, że powrócił ** null **, ponieważ użyłem Skrzypka do skomponowania mojej prośby i przetestowania autoryzacji. Z kaprysu po prostu utworzyłem kontroler testowy w mojej kanciastej aplikacji, aby poprosić o token i mój użytkownik jest teraz wypełniony! – mmoreno79