web-dev-qa-db-fra.com

API WEB - Authentification avec jeton porteur

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

3
DevExpress

Ce que vous devez faire est de suivre ces étapes 

  • Créez un projet d'API Web avec Comptes d'utilisateurs individuels Authentification.
  • Maintenant, vous aurez tout prêt à utiliser les API pour vous inscrire, changer le mot de passe, ainsi que le point de terminaison de l'API pour générer un jeton pour un utilisateur.
  • Créez un autre projet mais il s'agit cette fois deMVCavec Pas d'authentification dans la même solution.

bien ce sera notre architecture

 enter image description here

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");
     }
}
3
Jawand Singh

` 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");
 }

} `

0
Rajesh Kashyap