Wie store-bearer-Token, wenn MVC und Web API sind in verschiedenen Projekten

Situation:
Ich habe eine Web-API-2-Projekt fungiert als ein Authorization server (/token-Endpunkt) und ein Ressourcen-server. Ich bin mit der Vorlage, kommt aus der box mit ASP.Net Web-API-abzüglich der MVC-Referenz.
Die Starten.Auth konfiguriert ist, wie folgt:

public void ConfigureAuth(IAppBuilder app)
        {
            //Configure the db context and user manager to use a single instance per request
            app.CreatePerOwinContext(ApplicationDbContext.Create);
            app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);

            //Enable the application to use a cookie to store information for the signed in user
            //and to use a cookie to temporarily store information about a user logging in with a third party login provider
            app.UseCookieAuthentication(new CookieAuthenticationOptions());
            app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);

            //Configure the application for OAuth based flow
            PublicClientId = "self";
            OAuthOptions = new OAuthAuthorizationServerOptions
            {
                TokenEndpointPath = new PathString("/Token"),
                Provider = new ApplicationOAuthProvider(PublicClientId),
                AuthorizeEndpointPath = new PathString("/Account/ExternalLogin"),
                AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
                //In production mode set AllowInsecureHttp = false
                AllowInsecureHttp = true
            };

            //Enable the application to use bearer tokens to authenticate users
            app.UseOAuthBearerTokens(OAuthOptions);

            var facebookAuthenticationOptions = new FacebookAuthenticationOptions()
            {
                AppId = ConfigurationManager.AppSettings["Test_Facebook_AppId"],
                AppSecret = ConfigurationManager.AppSettings["Test_Facebook_AppSecret"],
                //SendAppSecretProof = true,
                Provider = new FacebookAuthenticationProvider
                {
                    OnAuthenticated = (context) =>
                    {
                        context.Identity.AddClaim(new System.Security.Claims.Claim("FacebookAccessToken", context.AccessToken));
                        return Task.FromResult(0);
                    }
                }
            };

            facebookAuthenticationOptions.Scope.Add("email user_about_me user_location");
            app.UseFacebookAuthentication(facebookAuthenticationOptions);

        }

MVC 5 Client (anderes Projekt) verwendet das Web-API-app für die Autorisierung und Daten. Unten ist der code zum abrufen der Bearer-token im Falle von Benutzername/Kennwort speichern:

[HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
    {
        if (!ModelState.IsValid)
        {
            model.ExternalProviders = await GetExternalLogins(returnUrl);
            return View(model);
        }

        var client = Client.GetClient();

        var response = await client.PostAsync("Token", 
            new StringContent(string.Format("grant_type=password&username={0}&password={1}", model.Email, model.Password), Encoding.UTF8));

        if (response.IsSuccessStatusCode)
        {
            return RedirectToLocal(returnUrl);
        }
        return View();
    }

Problem

Konnte ich wieder die Bearer-token und fügen Sie es zu der Authorization-Header für nachfolgende Aufrufe. Ich denke, das wäre ok, im Falle eines Winkel-App oder ein SPA. Aber ich denke, es sollte etwas sein, MVC, Griffe es für mich, wie automatisch speichern Sie Sie in einem cookie und das cookie senden, auf nachfolgende Anforderungen. Ich habe gesucht um eine ganze Menge und es gibt Beiträge, die Hinweis auf diese ( Die Registrierung von Web-API-2 externe logins von mehreren API-clients, die mit OWIN Identität ), aber ich habe nicht in der Lage, um herauszufinden, was zu tun ist, nachdem ich einen token.

Muss ich etwas hinzufügen, in der MVC-app Starten.Auth?

Ideal, ich brauche die Funktionalität, die der AccountController in ASP.Net Vorlage (MVC + Web-API) ermöglicht out-of-box (Anmeldungen, Registrierung, Externe logins, Passwort vergessen etc etc...), aber mit MVC und Web API in verschiedenen Projekten.

Gibt es eine Vorlage oder ein git-repo, das hat dieser boiler plate code?

Vielen Dank im Voraus!

Update
Die Einbeziehung @FrancisDucharme Anregungen, unten ist der code für GrantResourceOwnerCredentials().

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
        {
            var userManager = context.OwinContext.GetUserManager<ApplicationUserManager>();

            ApplicationUser user = await userManager.FindAsync(context.UserName, context.Password);

            if (user == null)
            {
                context.SetError("invalid_grant", "The user name or password is incorrect.");
                return;
            }

            ClaimsIdentity oAuthIdentity = await user.GenerateUserIdentityAsync(userManager,
               OAuthDefaults.AuthenticationType);
            ClaimsIdentity cookiesIdentity = await user.GenerateUserIdentityAsync(userManager,
                CookieAuthenticationDefaults.AuthenticationType);

            AuthenticationProperties properties = CreateProperties(user.UserName);
            AuthenticationTicket ticket = new AuthenticationTicket(oAuthIdentity, properties);

            //Add a response cookie...
            context.Response.Cookies.Append("Token", context.Options.AccessTokenFormat.Protect(ticket));


            context.Validated(ticket);
            context.Request.Context.Authentication.SignIn(cookiesIdentity);
        }

Aber ich kann nicht noch scheinen, Cookie oder herauszufinden, was als Nächstes zu tun ist.

Wir Erneut Fragen:

  1. Was wäre die richtige Art und Weise zu authentifizieren, autorisieren und aufrufen von Web-API-Methoden (Auth-und Ressourcen-server) von einem MVC-client?
  2. Ist es boilerplate-code oder template für AccountController, die nicht die grundlegenden Sanitär (Login, register, interne/externe, Passwort vergessen etc.)?
Wenn Sie Ihren Web-API-Rückgabe der token-hash in der response-cookies, die der client sendet das cookie für alle nachfolgenden Anfragen, sofern der client-browser die cookies aktiviert.
können Sie erläutern, wie dieser Prozess bitte. Ich bin mit dem standard-token-Endpunkt und config, das kommt aus der web-api-Vorlage.
Ihr Hauptproblem ist, dass Sie wollen, dass die MVC-client immer den Authorization: Bearer <hash> header automatisch, richtig ?
Yep, und ich denke, dass das MVC-Weg ist, um es zu speichern in einem cookie gesendet wird, auf nachfolgende Anforderungen (ich könnte sehr falsch). Ich bin sicher, dass mir etwas fehlt in der Startup.Auth für die MVC-client. Gerade jetzt, ich habe keine auth die im Client konfiguriert.
Muss ich etwas extra zu tun, sobald ich die token in der Antwort (in der MVC Login-Verfahren - gepostet oben)?

InformationsquelleAutor Amanvir Mundra | 2016-01-08

Schreibe einen Kommentar