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:
- 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?
- Ist es boilerplate-code oder template für AccountController, die nicht die grundlegenden Sanitär (Login, register, interne/externe, Passwort vergessen etc.)?
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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnten Sie die Start-Klasse, eine Antwort zurück Cookies, die der client dann wieder für alle weiteren Anfragen, hier ein Beispiel. Ich würde es in
GrantResourceOwnerCredentials
.Die Startup-Klasse:
Geht davon aus, dass der Kunde die cookies aktiviert, natürlich.
Dann, ändern Sie Ihre MVC-Header hinzufügen der Authorization-header an alle requests als solche.
In der
ActionFilterAttribute
zu, Holen Sie Ihre cookie-Wert (Token
) und fügen Sie die Kopfzeile.Ich habe aktualisiert die Frage, Ihre Anregungen mit. Ich bin nicht in der Lage zu bekommen, dass Cookies im browser, vielleicht, weil ich bin mit HttpClient (bitte entschuldigen Sie meine begrenzte Verständnis des Konzepts). Glaubst du, das ist der richtige Weg zu gehen? Ich habe aktualisiert die Fragen, um ein Verständnis über die richtige Art und Weise zu implementieren, der gesamte handshake.
Tut mir Leid, ich habe nicht viel Erfahrung mit ASP MVC client-Seite. Was
Client
genau ? Check-in Chrom-Netzwerk, wenn Sie die cookie wieder zurück in die Antwort-Header beim Posten /token.ASP.Net MVC 5 ist die client-app. Geprüft in chrome Registerkarte "Netzwerk", und das cookie wird nicht angezeigt! Aber danke für die Hilfe aber. Ich werde Graben mehr.
InformationsquelleAutor Francis Ducharme