Potrei complicare eccessivamente le cose, ma abbiamo un ASP.NET interno MVC5 SPA con AngularJS che utilizza l'autenticazione di Windows. Questa applicazione ha un database back-end SQL che ha una tabella di utenti, contenente i loro nomi account e i rispettivi ruoli nell'applicazione. Effettueremo chiamate a un'altra applicazione API Web che dispone anche dell'autenticazione di Windows abilitata.ASP.NET MVC5/AngularJS/App API Web utilizzando l'autenticazione di Windows e OWIN
Ho provato a fare ricerche su come gestire l'autorizzazione utilizzando OWIN ma non sono riuscito a trovare esempi specifici relativi a OWIN e all'autenticazione di Windows. Tutto ciò che appare utilizza l'autenticazione dei moduli con un nome utente e una password.
Come posso utilizzare OWIN e Windows Auth per la mia app? Ecco un esempio della mia classe 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: Ops, ho dimenticato di includere ulteriori informazioni su ciò che vorremmo realizzare. Se possibile, vorremmo utilizzare i ticket di autenticazione al portatore in modo da non dover cercare l'utente e i relativi ruoli ogni volta che effettuiamo una chiamata a un metodo API web.
UPDATE 2: Come richiesto da Andrew, di seguito è la versione TLDR della mia classe _securityHelper, in particolare il metodo GetCurrentUser(). Noterete che sto cercando di chiamare:
HttpContext.Current.GetOwinContext().Request.User.Identity.Name
Questa restituisce sempre nulla per l'utente.
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;
}
}
Grazie Andrew. Questa è la serie di articoli che mi ha spinto a intraprendere questa strada e mi piacerebbe implementarla. Ho tutto a posto, ma quando provo a ottenere HttpContext.Current.User nel mio SimpleAuthorizationServerProvider.GrantResourceOwnerCredentials, è nullo e non riesco a ottenere il principale. Ho impostato il grant_type su "password" come raccomandato dall'articolo ma non riesco a ottenere il principal. – mmoreno79
puoi pubblicare il codice dalla tua classe 'SecurityHelper'? – Claies
Dopo aver provato alcune cose, si scopre che la mia implementazione della serie di articoli che Andrew aveva suggerito in origine stava funzionando. L'ostacolo che stavo cercando di superare era ottenere l'utente principale da HttpContext.Current.GetOwinContext(). Request.User. Ciò stava restituendo ** null ** nel mio metodo GetCurrentUser(). Bene, risulta che stava restituendo ** null ** perché stavo usando Fiddler per comporre la mia richiesta e testare l'autenticazione. Per un capriccio, ho semplicemente creato un controller di test nella mia app angolare per richiedere un token e il mio utente è ora popolato! – mmoreno79