ASP.NET MVC5/AngularJS/Web-API-app mithilfe der Windows-Authentifizierung und OWIN

Ich kann über die Dinge komplizieren, aber wir haben eine interne ASP.NET MVC5 SPA mit AngularJS mithilfe der Windows-Authentifizierung. Diese Anwendung hat eine SQL-back-end-Datenbank, die eine Tabelle mit Benutzern, die Ihre account-Namen und Ihre jeweiligen Rollen in der Anwendung. Wir werden die Anrufe an eine andere Web-API-Anwendung, die auch über Windows-Authentifizierung aktiviert ist.

Ich versucht habe zu tun Forschung auf, wie Autorisierung mit OWIN konnte aber nichts finden, alle spezifischen Beispiele in Bezug auf OWIN und Windows-Authentifizierung. Alles, was auftaucht, verwendet die forms-Authentifizierung mit einem Benutzernamen und Passwort.

Wie kann ich mich über die mit OWIN und Windows-Auth für meine app? Hier ist ein Beispiel meiner OAuthAuthorizationServerProvider Klasse.

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:
Oops, ich habe vergessen, um mehr Informationen darüber, was möchten wir erreichen. Wenn möglich, würden wir gerne verwenden, Träger Authentifizierungs-tickets, so dass wir nicht haben, um die Benutzer und Ihre Rollen immer wenn wir einen Aufruf einer web-api-Methode.

UPDATE 2:
Auf Anfrage von Andrew, unten ist die TLDR-version von meinem _securityHelper Klasse, speziell die GetCurrentUser () - Methode. Sie werden bemerken, dass ich bin versucht zu rufen:

HttpContext.Current.GetOwinContext().Request.User.Identity.Name

Diese immer wieder null für Benutzer.

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;
    }
}

InformationsquelleAutor der Frage mmoreno79 | 2014-11-06

Schreibe einen Kommentar