2016-07-01 7 views
3

Ich versuche, die gleiche Authentifizierung zwischen den MVC-Controllern und den Web-API-Controllern zu verwenden. Die Web-API befindet sich im selben Projekt, nur in einem Ordner/Controllers/API /.Owin-Authentifizierung in MVC und Web Api

Ich kann nicht herausfinden, wie man sich mit OWIN authentifizieren kann, wenn ich mich über MVC anmeldete und einen Anspruch und ein Cookie wie im folgenden Beispiel erstellte.

var identity = new ClaimsIdentity(new[] 
{ 
    new Claim(ClaimTypes.Name,"Admin"), 
    new Claim(ClaimTypes.Role,"Administrator") 
    , "ApplicationCookie"); 

    var ctx = Request.GetOwinContext(); 
    var authManager = ctx.Authentication; 
    authManager.SignIn(identity); 
    return RedirectToAction("Index", "Home", null); 
    } 

Alles funktioniert in den MVC-Controller in Ordnung, aber ich kann das [autorisiert (Roles = „Administrator“] -Attribut auf meinen Web-API-Controller und habe es korrekt funktioniert nicht verwenden. Es hat mich immer durchlässt unabhängig.

Dank

EDIT: Nur so, wie ich habe in der Lage gewesen, die IPrincipal eine statische Klasse und Eigenschaftsspeicher mit dies zu bekämpfen, und dann, wenn das Attribut Autorisieren Aufschalten, suchen Sie nach dieser Eigenschaft und überprüfen, ob die Rolle gibt es Auf diese Art. Welcher bin nicht sicher, ob das eine gute Idee ist oder nicht?

+0

Können Sie meine Antwort überprüfen? –

Antwort

5

Wo wird Ihr Authentifizierungscode geschrieben? MVC Controller oder Web API Controller? Ich würde empfehlen, es in Ihrem Web-API-Controller so zu verwenden, dass Sie es später für andere Anwendungen (SPA oder andere Webanwendungen) verwenden können. Sie müssen ein Autorisierungsserver-/Ressourcenservermodell erstellen (Entschuldigung für mein Englisch nicht sicher, wie man diesen Satz einrahmen kann). In Ihrem Fall ist sowohl die Web-API als auch die MVC-Site ein Ressourcen-Server.

Unten finden Sie eine Probe für JWT + Cookie-Middleware

Erstellen Sie einen Autorisierungsserver mit WEB-API und ASP.Net Identität mit JWT wie hier http://bitoftech.net/2015/02/16/implement-oauth-json-web-tokens-authentication-in-asp-net-web-api-and-identity-2/ erklärte

wenn Sie das tun, dass Ihre webAPIs startup.cs aussehen wie unten

/// Configures cookie auth for web apps and JWT for SPA,Mobile apps 
    private void ConfigureOAuthTokenGeneration(IAppBuilder app) 
    { 
     // Configure the db context, user manager and role manager to use a single instance per request 
     app.CreatePerOwinContext(ApplicationDbContext.Create); 
     app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create); 
     app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create); 

     //Cookie for old school MVC application 
     var cookieOptions = new CookieAuthenticationOptions 
     { 
      AuthenticationMode = AuthenticationMode.Active, 
      CookieHttpOnly = true, // JavaScript should use the Bearer 
      AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,     
      LoginPath = new PathString("/api/Account/Login"), 
      CookieName = "AuthCookie" 
     }; 
     // Plugin the OAuth bearer JSON Web Token tokens generation and Consumption will be here 
     app.UseCookieAuthentication(new CookieAuthenticationOptions()); 

     OAuthServerOptions = new OAuthAuthorizationServerOptions() 
     { 
      //For Dev enviroment only (on production should be AllowInsecureHttp = false) 
      AllowInsecureHttp = true, 
      TokenEndpointPath = new PathString("/oauth/token"), 
      AccessTokenExpireTimeSpan = TimeSpan.FromDays(30), 
      Provider = new CustomOAuthProvider(),     
      AccessTokenFormat = new CustomJwtFormat(ConfigurationManager.AppSettings["JWTPath"]) 
     }; 

     // OAuth 2.0 Bearer Access Token Generation 
     app.UseOAuthAuthorizationServer(OAuthServerOptions); 
    } 

können Sie CustomOAuthProvider, CustomJwtFormat Klassen finden hier https://github.com/tjoudeh/AspNetIdentity.WebApi/tree/master/AspNetIdentity.WebApi/Providers

In Ihrem MVC App hinzufügen unten in startup.cs

public void Configuration(IAppBuilder app) 
    { 
      ConfigureOAuthTokenConsumption(app); 
    } 

    private void ConfigureOAuthTokenConsumption(IAppBuilder app) 
    { 
     var issuer = ConfigurationManager.AppSettings["AuthIssuer"]; 
     string audienceid = ConfigurationManager.AppSettings["AudienceId"]; 
     byte[] audiencesecret = TextEncodings.Base64Url.Decode(ConfigurationManager.AppSettings["AudienceSecret"]); 

     app.UseCookieAuthentication(new CookieAuthenticationOptions { CookieName = "AuthCookie" , AuthenticationType=DefaultAuthenticationTypes.ApplicationCookie }); 

     //// Api controllers with an [Authorize] attribute will be validated with JWT 
     app.UseJwtBearerAuthentication(
      new JwtBearerAuthenticationOptions 
      { 
       AuthenticationMode = AuthenticationMode.Passive, 
       AuthenticationType = "JWT", 
       AllowedAudiences = new[] { audienceid }, 
       IssuerSecurityTokenProviders = new IIssuerSecurityTokenProvider[] 
       { 
        new SymmetricKeyIssuerSecurityTokenProvider(issuer, audiencesecret)       
       } 

      }); 
    } 

In Ihren MVC-Controller, wenn Sie die Token-de-serialisiert sie und erzeugt ein Cookie aus dem Zugriffstoken

  AccessClaims claimsToken = new AccessClaims(); 
      claimsToken = JsonConvert.DeserializeObject<AccessClaims>(response.Content); 
      claimsToken.Cookie = response.Cookies[0].Value;    
      Request.Headers.Add("Authorization", "bearer " + claimsToken.access_token); 
      var ctx = Request.GetOwinContext(); 
      var authenticateResult = await ctx.Authentication.AuthenticateAsync("JWT"); 
      ctx.Authentication.SignOut("JWT"); 
      var applicationCookieIdentity = new ClaimsIdentity(authenticateResult.Identity.Claims, DefaultAuthenticationTypes.ApplicationCookie); 
      ctx.Authentication.SignIn(applicationCookieIdentity); 

Mit diesem einem Empfang Der Cookie wird erstellt und das Attribut [Autorisieren] in MVC Site und WebAPI erkennt diesen Cookie.