11 messaggi dal 29 giugno 2016
Ciao a tutti
Dovrei creare un portale per esporre dei servizi, ma mi sono bloccato per quanto riguarda autenticazione..
In pratica vorrei che l'autenticazione per il portale (MVC) e le web api sia unica nel senso che se quando hai loggato al portale puoi anche avere accesso alle web api e il login e il logout venga effettuato per tutte e due non che magari sei connesso al portale ma non puoi fare le chiamate alle web api e viceversa.
Consigli?
Grazie in anticipo!

PS: le web api le vorrei creare in un progetto a parte per future integrazioni con il mobile ecc..
Modificato da passa1248 il 22 maggio 2017 10.38 -
244 messaggi dal 22 gennaio 2017
Contributi
Per il tuo scopo ti consiglio di creare un "authentication server" esterno che ti restituisca un token, ad esempio jwt, da utilizzare per l'accesso alle risorse MVC e web api.
11 messaggi dal 29 giugno 2016
Credo sia abbastanza complicato...
Se invece creassi un'app web MVC senza autenticazione e nella pagina di login faccio fare la chiamata alla web api che in caso di accesso riuscito gli restituisce un token che l'app mvc si salva come cookie e poi ad ogni chiamata alla web api utilizzo il token salvato nel cookie; andrebbe bene o ci sarebbe qualche problema a livello di sicurezza?

In questo caso però l'app mvc non sarebbe in grado di stabilire se l'utente è autorizzato o no con la decorazione [authorize] sul controller, bisognerebbe far in modo che il cookie generato con il token faccia capire al controller che l'utente è loggato, è possibile?
Grazie in anticipo!
Modificato da passa1248 il 22 maggio 2017 16.33 -
244 messaggi dal 22 gennaio 2017
Contributi
La soluzione mi sembra alquanto creativa, ma è comunque fattibile.
Se vuoi avere l'utente autenticato sia per MVC che WebApi dovresti salvare lo stesso cookies per domini diversi. In questo caso le data annotation del controller MVC dovrebbero funzionare.

Una seconda soluzione che ti suggerisco:
La webapi genera un token JWT il quale viene utilizzato sia dall'applicazione MVC che dalla applicazione WebApi.

In questo caso la WebApi fa semplicemente da "Autentication Server" e tutte le altre applicazioni sfruttano il token stesso. Il token lo puoi salvare lato client.
11 messaggi dal 29 giugno 2016
ok perseguendo la seconda soluzione nello Startup.Auth cosa ci devo mettere al posto di
  app.UseCookieAuthentication(new CookieAuthenticationOptions
            {
                AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
                LoginPath = new PathString("/Account/Login"),
                 
                Provider = new CookieAuthenticationProvider
                {
                    // Consente all'applicazione di convalidare l'indicatore di sicurezza quando l'utente esegue l'accesso.
                    // Questa funzionalità di sicurezza è utile quando si cambia una password o si aggiungono i dati di un account di accesso esterno all'account personale.  
                    OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
                        validateInterval: TimeSpan.FromMinutes(30),
                        regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
                }
            });  

per fare in modo che come autenticazione accetti il token rilasciato dalla web api?
244 messaggi dal 22 gennaio 2017
Contributi
Ciao, dovresti farmi vedere anche la webapi per comprendere meglio.
Riesci a pubblicare un esempio su github o simili?
11 messaggi dal 29 giugno 2016
Ciao
Per le web api ho utilizzato il template di default di visual studio selezionando "Individual user account",
comunque il webapiconfig:

  public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Servizi e configurazione dell'API Web
            // Configurare l'API Web per usare solo l'autenticazione con token di connessione.
            config.SuppressDefaultHostAuthentication();
            config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));

            // Route dell'API Web
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
        }
    }


mentre lo startup.cs:
 public partial class Startup
    {
        public static OAuthAuthorizationServerOptions OAuthOptions { get; private set; }

        public static string PublicClientId { get; private set; }

        // For more information on configuring authentication, please visit https://go.microsoft.com/fwlink/?LinkId=301864
        public void ConfigureAuth(IAppBuilder app)
        {
            // Configurare il contesto di database e la gestione utenti per l'utilizzo di un'unica istanza per richiesta
            app.CreatePerOwinContext(ApplicationDbContext.Create);
            app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);

            // Consentire all'applicazione di utilizzare un cookie per memorizzare informazioni relative all'utente connesso
            // e per memorizzare temporaneamente le informazioni relative a un utente che accede tramite un provider di accesso di terze parti
            app.UseCookieAuthentication(new CookieAuthenticationOptions());
            app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);

            // Configurare l'applicazione per il flusso basato su OAuth
            PublicClientId = "self";
            OAuthOptions = new OAuthAuthorizationServerOptions
            {
                TokenEndpointPath = new PathString("/Token"),
                Provider = new ApplicationOAuthProvider(PublicClientId),
                AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
                AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
                // In modalità di produzione impostare AllowInsecureHttp = false
                AllowInsecureHttp = true
            };

            // Consentire all'applicazione di utilizzare token di connessione per autenticare gli utenti
            app.UseOAuthBearerTokens(OAuthOptions);

           
           
        }
    }
244 messaggi dal 22 gennaio 2017
Contributi
Nella WebApi hai una sezione in cui generi il token e una in cui lo validi.

La sezione di generazione:
OAuthOptions = new OAuthAuthorizationServerOptions
{
TokenEndpointPath = new PathString("/Token"),
...
AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
};

La sezione di validazione:
app.UseOAuthBearerTokens(OAuthOptions);

Se la 2 sezione la applichi anche all'applicazione MVC, potrai validare i token rilasciati dalla WebApi.
Il token generato dalla WebApi dovrai passarlo ad ogni richiesta verso WebApi e MVC. Il token va nell'header della richiesta.


Un esempio dal quale potresti prendere spunto è il seguente: http://bitoftech.net/2014/09/24/decouple-owin-authorization-server-resource-server-oauth-2-0-web-api/

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.