J'ai créé une application MVC pour permettre l'authentification/enregistrement externe. Il a créé avec tous les composants nécessaires (Owin, EF, Regiter, Connexion, Déconnexion) et je suis en mesure d’exécuter toutes les activités de base de l’application.
Maintenant, je souhaite intégrer l'application Web à l'API WEB, qui sera également utilisée par mon application mobile. Je me suis retrouvé bloqué dans l'authentification dans les appels de l'API Web (avec le jeton porteur que j'ai reçu de l'application Web).
J'ai vu des exemples pour créer des projets d'API WEB avec le middleware OWIN activé. Mais je ne sais pas comment centraliser le processus d'authentification externe et utiliser le jeton à la fois pour mon application Web et pour l'application mobile . Et Je ne souhaite pas utiliser l'application ANGULAR ou Single page. Quelqu'un peut-il me suggérer le bon chemin technique pour résoudre ce problème Merci.
Étape 1:
J'ai créé un projet MVC dans Visual Studio 2015 avec Individual Login Enabled. Et configuré les clés que j'ai tout configuré dans la console de développeur Google. Mon Startup.cs aura le code suivant
public void ConfigureAuth(IAppBuilder app)
{
// Configure the db context, user manager and signin manager to use a single instance per request
app.CreatePerOwinContext(ApplicationDbContext.Create);
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.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
// Configure the sign in cookie
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login"),
Provider = new CookieAuthenticationProvider
{
// Enables the application to validate the security stamp when the user logs in.
// This is a security feature which is used when you change a password or add an external login to your account.
OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
validateInterval: TimeSpan.FromMinutes(30),
regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
}
});
Étape 2:
Modification du fichier webconfig pour qu'il pointe vers ma base de données locale et exécute l'application. Je parviens à me connecter via google avec mon compte gmail. Les détails de l'utilisateur sont ajoutés à ASPUSerTables dans la base de données.
Étape 3:
Maintenant, je voulais créer un projet d'API WEB qui sera connecté à la base de données et permettra de récupérer des données dans l'application Web MVC et l'application Mobile (je suis bloqué sur la partie authentification ici). Je dois également utiliser l'authentification par un tiers pour mon application mobile (Xamarin) et utiliser l'API commune de mon application mobile et du site Web MVC.
Étape 4 Je me suis donc dit qu'au lieu d'une application Web (Étape 1), j'aurais dû créer un projet API Web qui ressemblera à l'exemple ci-dessous pour renvoyer le jeton d'authentification dans Startup.cs stocker ce cookie sur le site Web pour transmettre les demandes suivantes.
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("/api/Account/ExternalLogin"),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
// In production mode set AllowInsecureHttp = false
AllowInsecureHttp = true
};
Je ne veux pas utiliser ANGULAR et j'ai besoin de mon projet WebApplication (MVC) et de l'API WEB qui s'authentifie correctement pour toutes les demandes. Veuillez me conseiller le Droit chemin. Merci
Ce que vous devez faire est de suivre ces étapes
bien ce sera notre architecture
Ceci est contrôleur API
[Authorize]
public class ValuesController : ApiController
{
[HttpGet]
public IEnumerable<string> Get()
{
return new string[] { "values1", "values2" };
}
}
Ceci est votre contrôleur MVC
public class MVCValuesController : Controller
{
HttpClient client;
// web api Url
string url = string.Format("http://localhost:60143/api/Values");
string bearerToken = string.Format("bearer token from web api");
public MVCValuesController()
{
client = new HttpClient();
client.BaseAddress = new Uri(url);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.Accept.Add("Authorization", "Bearer " + bearerToken);
}
public ActionResult GetValues()
{
HttpResponseMessage responseMessage = client.Get(url);
if (responseMessage.IsSuccessStatusCode)
{
var responseData = responseMessage.Content.ReadAsStringAsync().Result;
var jsonResponse = JsonConvert.DeserializeObject<List<string>>(responseData);
return View(jsonResponse);
}
return View("Error");
}
}
Je n'ai pas utilisé async ici, mais vous pouvez le faire. Vous devez également démarrer vos deux projets lorsque vous l'exécutez. Faites un clic droit sur la solution et cliquez sur Set Start Up projects
. Vous pourrez alors sélectionner plusieurs projets et définir l’action sur Start
.
public class MVCAccountController : Controller
{
HttpClient client;
// web api Url
string url = string.Format("http://localhost:60143/");
//string bearerToken = string.Format("bearer token from web api");
public MVCValuesController()
{
client = new HttpClient();
client.BaseAddress = new Uri(url);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
// just adding a JObject you can create a class
JObject tokenJobject = new JObject(
new JProperty("Email", "[email protected]"),
new JProperty("Password", "Pass123"));
new JProperty("ConfirmPassword", "Pass123"));
HttpContent baseContent = new StringContent(tokenJobject.ToString(), Encoding.UTF8, "application/json");
//client.DefaultRequestHeaders.Accept.Add("Authorization", "Bearer " + bearerToken);
}
public async Task<ActionResult> GetValues()
{
string requestUri = string.Format("api/Account/Register");
HttpResponseMessage responseMessage = await client.PostAsync(requestUri, baseContent);
if (responseMessage.IsSuccessStatusCode)
{
var responseData = responseMessage.Content.ReadAsStringAsync();
var jsonResponse = JsonConvert.DeserializeObject<string>(responseData);
return View(jsonResponse);
}
return View("Error");
}
}
` public class MVCValuesController: contrôleur { Client HttpClient;
// web api Url
string url = string.Format("http://localhost:60143/api/Values");
string bearerToken = string.Format("bearer token from web api");
public MVCValuesController()
{
client = new HttpClient();
client.BaseAddress = new Uri(url);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", bearerToken);
}
public ActionResult GetValues()
{
HttpResponseMessage responseMessage = client.Get(url);
if (responseMessage.IsSuccessStatusCode)
{
var responseData = responseMessage.Content.ReadAsStringAsync().Result;
var jsonResponse = JsonConvert.DeserializeObject<List<string>>(responseData);
return View(jsonResponse);
}
return View("Error");
}
} `