Comment utiliser JWT dans MVC application for authentication and authorization?

j'ai prévu d'utiliser asp.net Identité 2.0 asp.net application MVC pour l'authentification et l'autorisation.

Renvoi le lien ci-dessous

JSON Web Token in ASP.NET Web API 2 utilisant Owin

j'ai pu créer un JWT(access token) pour l'utilisateur valide, c'est-à-dire que lorsque l'utilisateur se connecte à l'application, je vais valider l'utilisateur avec son nom et son mot de passe, puis je vais émettre un JSON Web token pour cet utilisateur valide.

maintenant, je lis dans certains articles que nous devons passer le jeton porteur dans les en-têtes pour chaque demande de valider l'utilisateur pour l'authentification. Dans MVC, nous fournirons L'attribut Authorize pour les méthodes qui doivent être protégées comme indiqué ci-dessous...

      public class UserController : BaseHRAppController
      {
            [Authorize]
            public ActionResult Index()
            {          
               return View();
            }
       }

Comment dire à mon application MVC d'utiliser JWT pour valider L'utilisateur.

je veux faire mon application MVC pour valider l'utilisateur en utilisant JWT chaque fois que l'utilisateur essaie d'accéder à la méthode avec l'attribut authorize. Depuis, je vais utiliser des appels ajax dans de nombreuses pages pour accéder à la méthode présente dans le contrôleur mvc, Je ne pense pas que ce soit une bonne façon de passer un token sur chaque requête ajax. J'ai besoin d'aide pour accomplir l'authentification et l'autorisation de manière efficace en utilisant asp.net identité dans l'application MVC.

actuellement, Je ne sais pas comment utiliser ce JWT token pour l'authentification et l'autorisation dans l'application mvc. Toute aide est appréciée Grâce.

22
demandé sur SDK 2015-04-22 11:14:50

2 réponses

pour que MVC comprenne quoi que ce soit à propos de votre JWT, vous devez lui dire :-) . Tout d'abord, installez le paquet Jwt de nuget:

Install-Package Microsoft.Owin.Security.Jwt

alors ouvrez votre Startup.fichier cs et ajouter une nouvelle fonction qui indiquera à MVC comment consommer JWT. Dans les bases de votre Démarrage ressemblera à quelque chose comme:

using System.Configuration;
using Microsoft.Owin;
using Microsoft.Owin.Security;
using Microsoft.Owin.Security.DataHandler.Encoder;
using Microsoft.Owin.Security.Jwt;
using Owin;

[assembly: OwinStartupAttribute(typeof(TOMS.Frontend.Startup))]
namespace TOMS.Frontend
{
    public partial class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            ConfigureAuth(app);
            ConfigureOAuthTokenConsumption(app);
        }

        private void ConfigureOAuthTokenConsumption(IAppBuilder app)
        {
            var issuer = ConfigurationManager.AppSettings["as:Issuer"];
            var audienceId = ConfigurationManager.AppSettings["as:AudienceId"];
            var audienceSecret = TextEncodings.Base64Url.Decode(ConfigurationManager.AppSettings["as:AudienceSecret"]);

            // Api controllers with an [Authorize] attribute will be validated with JWT
            app.UseJwtBearerAuthentication(new JwtBearerAuthenticationOptions
            {
                AuthenticationMode = AuthenticationMode.Active,
                AllowedAudiences = new[] { audienceId },
                IssuerSecurityTokenProviders = new IIssuerSecurityTokenProvider[]
                {
                    new SymmetricKeyIssuerSecurityTokenProvider(issuer, audienceSecret) 
                }
            });
        }
    }
}

vous remarquerez que je place l'émetteur, audienceId et audienceSecret dans mon Web.fichier de configuration. (Ces valeurs doivent correspondre à celles de votre ressource Serveur.) Aussi, vous pourriez vouloir vous assurer d'avoir un Système à jour.IdentityModel.Jeton.Jwt en cours d'exécution:

Update-package System.IdentityModel.Tokens.Jwt

avec ceux définis, vous pouvez décorer votre action de controller avec l'attribut [Authorize] et jouer la balle.

Jouer à la balle qui veut dire le feu à votre demande à partir de votre javascript de votre protégé action de contrôleur:

//assuming you placed the token in a sessionStorage variable called tokenKey when it came back from your Authorization Server
    var token = sessionStorage.getItem(tokenKey);
    var headers = {};
    if (token) {
        headers.Authorization = 'Bearer ' + token;
    }

    $.ajax({
        type: 'GET',
        url: 'CONTROLLER/ACTION',
        headers: headers
    }).done(function (data) {
        self.result(data);
    }).fail(showError);

UPDATE Par ailleurs, si vous souhaitez ajouter les valeurs de votre site web.fichier de configuration afin de les récupérer comme Je l'ai fait ci-dessus; il suffit de les ajouter en vertu de la AppSettings:

<configuration>
 <appSettings>
    <add key="issuer" value="YOUR_ISSUER" />
    <add key="audienceId" value="YOUR_AUDIENCEID" />
    <add key="audienceSecret" value="YOUR_AUDIENCESECRET" />
 </appSettings>
</configuration>

...bien sûr, remplacer les "valeurs" par les vôtres

29
répondu Houdini Sutherland 2018-02-08 17:44:58

Je ne sais pas si vous avez résolu ce problème, mais j'avais un problème similaire et j'ai décidé de stocker le token en utilisant FormsAuthentication dont j'ai été capable de crypter le token, et sur chaque requête le cookie a été passé en arrière et puis je pourrais le décrypter pour obtenir le JWT et puis retirer les rôles/revendications de et puis utiliser ces rôles pour créer et identifier Principal qui me permettrait de décorer mes méthodes de contrôleur avec [Authorize(Role="blah,blah")].

Voici un exemple de code dessous.

une fois que vous avez récupéré le jeton web JSON de l'api après la connexion, vous pouvez utiliser quelque chose comme:

var returnedToken = (TokenResponse)result.ReturnedObject;
var ticket = new FormsAuthenticationTicket(1, model.Email, DateTime.Now, ConvertUnitToDateTime(returnedToken.expires_in), true, returnedToken.access_token);
string encryptedTicket = FormsAuthentication.Encrypt(ticket);
var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
cookie.HttpOnly = true;
Response.Cookies.Add(cookie)

j'y ai quelques-unes de mes propres classes et méthodes créées, mais cela vous donnera l'idée générale que vous stockez le JWT d'accès ainsi que la date d'expiration dans votre cookie FormsAuthentication.

puis le cookie est transmis avec chaque requête et dans votre Global.fichier asax vous pouvez avoir une méthode pour authentifier le demande:

protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
    HttpCookie authCookie = Request.Cookies[FormsAuthentication.FormsCookieName];
    if (authCookie != null)
    {
        //Extract the forms authentication cookie
        FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);

        JwtSecurityToken jwTok = TokenHelper.GetJWTokenFromCookie(authCookie); 

        // Create the IIdentity instance
        IIdentity id = new FormsIdentity(authTicket);

        // Create the IPrinciple instance
        IPrincipal principal = new GenericPrincipal(id, TokenHelper.GetRolesFromToken(jwTok).ToArray());

        // Set the context user
        Context.User = principal;
    }
}

donc cette méthode vous décryptez le cookie pour obtenir le JWT token d'accès que vous pouvez ensuite décoder en utilisant le système.IdentityModel.Jeton.JWT bibliothèque de Microsoft et puis prendre ces rôles et ID et de générer le principal et l'identité pour l'utilisateur qui crée votre utilisateur avec les rôles.

alors ces rôles peuvent être validés par rapport à l'attribut [Authorize].

9
répondu reverence12389 2018-05-31 21:27:22