2015-07-24 21 views
5

Kimlik doğrulama sırasında bir Müdür'e bazı ek istemler eklemek istiyorum. Benim MVC Windows Kimlik Doğrulaması kullanan 4.5 projeyi özel ClaimsAuthenticationManager uygulamak çalışıyorum:İddialarAuthenticationManager.Authenticate hiçbir zaman denir

namespace Project.Infrastructure 
{ 
    public class ClaimsTransformer : ClaimsAuthenticationManager 
    { 
     public override ClaimsPrincipal Authenticate(string resourceName, ClaimsPrincipal incomingPrincipal) 
     { 
      if (incomingPrincipal != null && incomingPrincipal.Identity.IsAuthenticated == true) 
      { 
       ((ClaimsIdentity)incomingPrincipal.Identity).AddClaim(new Claim(ClaimTypes.Role, "Admin")); 
      } 

      return incomingPrincipal; 
     } 
    } 
} 

benim özel sınıf kullanmak üzere ayarlanmış web.config var:

<configSections> 
    <section name="system.identityModel" type="System.IdentityModel.Configuration.SystemIdentityModelSection, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/> 
</configSections> 

ve

<system.identityModel> 
    <identityConfiguration> 
     <claimsAuthenticationManager type="Project.Infrastructure.ClaimsTransformer, [AssemblyName]" /> 
    </identityConfiguration> 
</system.identityModel> 

Ama kimlik doğrulaması yöntemi hiçbir zaman aranmaz. Bir şey mi eksik?

+0

İstemci yetkilendirme modülünü .config dosyanıza eklediniz mi? –

+1

Hayır, yetkilendirmeyi özelleştirmiyorum. Anladığım kadarıyla ikisi birbirinden ayrı ve birbirinden ayrı ve diğeri bağımlı değil. Bu doğru değil mi? – newmanth

cevap

4

Eksik adım, tüm bunları kapatmak için bir HTTP Modülü eklemeniz gerektiğidir.

Yani, şöyle bir sınıf gerekir:

public class MyClaimsAuthenticationModule : IHttpModule 
{ 
    public void Init(HttpApplication context) 
    { 
     context.PostAuthenticateRequest += Context_PostAuthenticateRequest; 
    } 

    public void Dispose() 
    { 
     // Nothing to dispose, method required by IHttpModule 
    } 

    void Context_PostAuthenticateRequest(object sender, EventArgs e) 
    { 
     var transformer = FederatedAuthentication.FederationConfiguration.IdentityConfiguration.ClaimsAuthenticationManager; 
     if (transformer != null) 
     { 
      var context = ((HttpApplication)sender).Context; 
      var principal = context.User as ClaimsPrincipal; 
      var transformedPrincipal = transformer.Authenticate(context.Request.RawUrl, principal); 

      context.User = transformedPrincipal; 
      Thread.CurrentPrincipal = transformedPrincipal; 
     } 
    } 
} 

Bu web.config'de belirtilen trafo almak ve üzerinde kimlik doğrulaması arayacak, daha sonra iade müdürünü takmak HttpContext ve geçerli iş parçacığı. Elbette, içinde PostAuthenticateRequest işleyicisindeki yöntemle Context_PostAuthenticationRequest kodunu koyabilirsiniz

<system.webServer> 
    <modules> 
    <add name="MyClaimsAuthenticationModule" type="MyApplication.MyHttpModels.MyClaimsAuthenticationModule, MyApplicationAssembly" /> 
    </modules> 
</system.webServer> 

Güncelleme:

Ayrıca web.config aşağıdaki gibi bir şey gerekir Global.asax.cs sınıf dosyanız. Bununla birlikte, sınıfların sorumluluklarını küçük tutmayı tercih ediyorum, bu yüzden IHttpModule'un bir uygulamasına geçiyorum, böylece modül kendi işini yapıyor ve bunun ne olduğu açık ve bunun çeşitli aşamalarında olabilecek diğer şeylerden ayrı. boru hattı.

Global.asax.cs dosyanız küçükse o zaman kodu buraya koyarak sorun yaşanmaz. Hala işe yaramalı. Bununla birlikte, sorumlulukları sınıfta karıştırıyorsunuz ve gelecekte de işe yaramadı.

+1

MSDN, ClaimsAuthenticationManager'ın Windows kimlik doğrulaması için çağrılmadığını ve el ile kablolanmasının gerekmediğini net olarak bilmiyordu. Teşekkürler ... tam olarak aradığım şey. Eğer bir global.asax dosyası zaten varsa bir Application_PostAuthenticateRequest yönteminde de telvesi gerçekleştirebileceğimi varsayıyor muyum? – newmanth

+0

Evet, sanırım yapabilirsin. Şahsen ben bunu yapmanın bir hayranı değilim, ben endişeleri ayrı tutmak için IHttpModule uygulayan sınıflara şeyler koymak tercih ederim. (yani, bu modül bir şey yapar) Eğer Global asaksınız küçükse ve küçük kalabiliyorsa, oradaki kodu koymaya ilişkin bir sorun görmüyorum. Açıkçası, eğer büyürse, çok şey yapmasıdır. Yani, gerçekten farklı sorumlulukları ayırmayı düşünmeniz gerekecek. –

+0

Neden System.IdentityModel.ClaimsAuthenticationManager üzerinden sapma almamız gerekiyor? - Demek istediğim, neden özel "ClaimsTransformer" kodunu doğrudan "MyClaimsAuthenticationModule" içine koyamıyorum? – Efrain

0

Kimlik Doğrulama yöntemini böyle bir şeyle mi çağırıyorsunuz ve Kimlik Doğrulama gerçekleşmiyor mu?

ClaimsTransformer manager = new ClaimsTransformer(); 
manager.Authenticate("resource", incomingPrincipal) 

Sen çağrısı ile ClaimsTransformer sınıf içinde gelen "incomingPrincipal dönüş" değiştirmek isteyebilir: Ayrıca

return base.Authenticate(resourceName, incomingPrincipal); 

neden Windows Authentication gerekiyor?

+1

Temel.Authentication yöntemi hiçbir şey yapmaz.Tam anlamıyla: "public virtual ClaimsPrincipal Authenticate (string resourceName, ClaimsPrincipal incomingPrincipal) { " return incomingPrincipal; } ' –