在代码中设置ClaimsAuthorizationManager(MVC 5)

时间:2014-01-26 21:36:45

标签: asp.net-mvc wif claims-based-identity

我有一个ASP.NET MVC 5应用程序,我正试图让我的头围绕索赔授权。我已经阅读了一些总是在web.config文件中设置ClaimsAuthorizationManager类的东西。

是否可以在代码中设置自定义ClaimsAuthorizationManager

3 个答案:

答案 0 :(得分:2)

我正在回答我自己的问题。在我的global.asax文件的ApplicationStart方法中,使用以下代码:

 System.IdentityModel.Services.FederatedAuthentication.FederationConfigurationCreated += (s, e) =>
        {

            e.FederationConfiguration.IdentityConfiguration.ClaimsAuthorizationManager = new MyCustomClaimsAuthorizationManager();
        };

答案 1 :(得分:2)

也许对这个答案的细微阐述可以帮助其他人,因为我刚刚在MVC 5,.NET 4.5.2中经历过一些非常相似的事情,并且发现它们值得理解这些组件在引擎盖。

我的主要目标:需要最小化.config依赖(ffwd:在我可用的时间,我找到了最小化但不完全删除的方法)

我使用这个答案的方法遇到的问题是我一直在收到错误,说我丢失了配置内容。在一些好的旧反射器反射之后,我发现这是由于mish-mosh,静态getter的菊花链,实例构造以及FederatedAuthenticationFederationConfiguation和{{1}之间的成员初始化引起的类。

首先,IdentityConfigution类的FederatedAuthentication getter属性延迟初始化基础' FederationConfiguration'字段。

FederationConfiguration

总结初始化例程:

  1. 调用public static FederationConfiguration FederationConfiguration { get { if (_federationConfiguration == null) { object federationConfigurationLock = FederationConfigurationLock; lock (federationConfigurationLock) { if (_federationConfiguration == null) { _federationConfiguration = CreateFederationConfiguration(); } } } return _federationConfiguration; } } 默认ctor(调用FederatedConfiguration,但我离题了)
  2. 解雇了联邦会议的'事件,您的代码将处理并执行任何操作
  3. 光验证
  4. 如果尚未初始化,请启动初始化链

    : this(true)
  5. 理解这个例程非常重要,因为,如果你确实参与了这个事件并试图做一些非预约的事情,你就不应该明白(至少对我而言) private static FederationConfiguration CreateFederationConfiguration() { System.IdentityModel.Services.Configuration.FederationConfiguration federationConfiguration = new System.IdentityModel.Services.Configuration.FederationConfiguration(); federationConfiguration = OnFederationConfigurationCreated(federationConfiguration); if (federationConfiguration.IsAmbiguous) { throw DiagnosticUtil.ExceptionUtil.ThrowHelperError(new ConfigurationErrorsException(System.IdentityModel.Services.SR.GetString("ID7018"))); } if (!federationConfiguration.IsInitialized) { federationConfiguration.Initialize(); } return federationConfiguration; } } 和/或FederationConfig类' IdentityConfig方法可以避免一些副作用,如果它们以其他方式为您调用。

    有一种模式"如果没有初始化,请致电Initialize()"在对象链中运行,并且由于实现,这些类的Initialize属性只能在IsInitialized方法成功完成时设置为返回true

    我能够设置自定义Initialize()并避免因.config依赖性而导致的错误的方式使我的事件处理程序足够聪明,可以在ConfigurationManager上抢先调用Initialize()方法object - 这实际上改变了框架的IdentityModel类中的执行路径。

    IdentityConfiguration

    有一些博客/ SO答案谈到如何以编程方式设置它,所有这些都在事件处理程序中具有简单的loc:var authZ = new MyClaimsAuthorizationManager(); FederatedAuthentication.FederationConfigurationCreated += (s, e) => { var identityConfiguration = e.FederationConfiguration.IdentityConfiguration; identityConfiguration.ClaimsAuthorizationManager = authZ; if (!identityConfiguration.IsInitialized) identityConfiguration.Initialize(); }; } ;不幸的是,由于我想要完成的事情,这还不够。希望这可以帮助其他人,简单的回答"还不够。

答案 2 :(得分:-1)

您应该可以通过ServiceConfiguration类设置它:

ServiceConfiguration.ClaimsAuthorizationManager = new MyClaimsAuthManager();

文档:http://msdn.microsoft.com/en-us/library/microsoft.identitymodel.configuration.serviceconfiguration.claimsauthorizationmanager.aspx