it-swarm.com.de

WEB API - Authentifizierung mit Trägertoken

Ich habe eine MVC-Anwendung für die externe Authentifizierung/Registrierung erstellt. Es wurde mit allen erforderlichen Komponenten erstellt (Owin, EF, Regiter, Login, Logout) und ich kann alle grundlegenden Aktivitäten in der Anwendung ausführen.

Nun möchte ich die Webanwendung mit der WEB-API integrieren, die auch von meiner mobilen App verwendet wird. Ich blieb bei der Authentifizierung in den Web-API-Aufrufen (mit dem Trägertoken, das ich von der Webanwendung erhalten habe).

Ich habe Beispiele zur Erstellung von WEB-API-Projekten mit aktivierter OWIN-Middleware gesehen. Aber ich weiß nicht, wie ich den externen Authentifizierungsprozess zentralisieren und das Token sowohl für meine Webanwendung als auch für die mobile Anwendung verwenden kann. Und Ich möchte nicht für die ANGULARoder Single-Page-Anwendung. Kann mir jemand den richtigen technischen Weg vorschlagen, um dieses Problem zu beheben. Vielen Dank.

Schritt 1:

Ich habe in Visual Studio 2015 ein MVC-Projekt mit Individual Login Enabled erstellt. Und die Keys so konfiguriert, dass ich alles in der Google Developer Console konfiguriert habe. Meine Startup.cs wird folgenden Code haben

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

Schritt 2:

Die webconfig-Datei wurde so geändert, dass sie auf meine lokale Datenbank verweist und die App ausgeführt wird. Ich kann mich über Google mit meinem Google Mail-Konto erfolgreich anmelden und Benutzerdetails werden erfolgreich zu ASPUSerTables in der Datenbank hinzugefügt

Schritt 3:

Jetzt wollte ich ein WEB-API-Projekt erstellen, das mit der DB verbunden wird, und einige Daten für die MVC-Webanwendung und die Mobile-Anwendung abrufen (hier stecke ich mit dem Authentifizierungsteil fest). Ich muss auch die Authentifizierung eines Drittanbieters für meine mobile App (Xamarin) verwenden und die allgemeine API von meiner mobilen App und der MVC-Website verwenden

Schritt 4 Also dachte ich, anstatt der WEB-Anwendung (Schritt 1) ​​hätte ich ein WEB-API-Projekt erstellt, das wie folgt aussieht, um das Auth-Token in Startup.cs zurückzugeben Speichern Sie dieses Cookie auf der Website, um die nachfolgenden Anforderungen zu übergeben.

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

Ich möchte nicht mit ANGULAR gehen und ich brauche meine WebApplication (MVC) und WEB API-Projektauthentifizierung für alle Anforderungen. Bitte geben Sie mir den Richtigen Weg. Danke

3
DevExpress

Was Sie tun müssen, ist diese Schritte zu befolgen 

  • Erstellen Sie ein Web-API-Projekt mit Individuelle Benutzerkonten Authentifizierung.
  • Jetzt haben Sie alle APIs für die Registrierung, das Ändern des Kennworts und den API-Endpunkt zum Generieren von Token für einen Benutzer bereit.
  • Erstellen Sie ein anderes Projekt, aber diesmal ist esMVCmit Keine Authentifizierung in derselben Lösung.

nun, das wird unsere Architektur sein

 enter image description here

Dies ist der API-Controller

[Authorize]
public class ValuesController : ApiController
{
      [HttpGet]
      public IEnumerable<string> Get()
      {
         return new string[] { "values1", "values2" };
      }
}

Dies ist Ihr MVC-Controller

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

Ich habe hier nicht async verwendet, aber Sie können es tun. Außerdem müssen Sie beide Projekte starten, wenn Sie es ausführen. Klicken Sie mit der rechten Maustaste auf Lösung, und klicken Sie auf Set Start Up projects. Dann können Sie mehrere Projekte auswählen und die Aktion als Start festlegen.

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

` öffentliche Klasse 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.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