Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 在代码中设置ClaimsAuthorizationManager(MVC 5)_Asp.net Mvc_Wif_Claims Based Identity - Fatal编程技术网

Asp.net mvc 在代码中设置ClaimsAuthorizationManager(MVC 5)

Asp.net mvc 在代码中设置ClaimsAuthorizationManager(MVC 5),asp.net-mvc,wif,claims-based-identity,Asp.net Mvc,Wif,Claims Based Identity,我有一个ASP.NETMVC5应用程序,我正在努力获得授权。我读过一些东西,它们总是在web.config文件中设置ClaimsAuthorizationManager类 是否可以在代码中设置自定义ClaimsAuthorizationManager 您应该能够通过ServiceConfiguration类进行设置: ServiceConfiguration.ClaimsAuthorizationManager = new MyClaimsAuthManager(); 文档:您应该能够通过Se

我有一个ASP.NETMVC5应用程序,我正在努力获得授权。我读过一些东西,它们总是在web.config文件中设置
ClaimsAuthorizationManager


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

您应该能够通过
ServiceConfiguration
类进行设置:

ServiceConfiguration.ClaimsAuthorizationManager = new MyClaimsAuthManager();

文档:

您应该能够通过
ServiceConfiguration
类进行设置:

ServiceConfiguration.ClaimsAuthorizationManager = new MyClaimsAuthManager();

医生:

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

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

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

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

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

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

也许这个对答案的细微阐述可以帮助其他人,因为我刚刚经历了MVC 5、.NET 4.5.2中非常类似的内容,并发现有必要了解这些组件在引擎盖下的行为

我的主要目标是:需要最小化.config依赖关系(ffwd:在我有时间的时候,我找到了最小化但不是完全移除的方法)

我在使用这个答案的方法时遇到的问题是,我不断收到一个错误,说我缺少配置内容。经过一些很好的老反射器反射后,我发现这是由
FederatedAuthentication
FederationConfiguation
IdentityConfiguration
类之间的mish-mosh、静态getter菊花链、实例构造和成员初始化造成的

首先,
FederatedAuthentication
类的
FederationConfiguration
getter属性惰性初始化底层的“FederationConfiguration”字段

public static FederationConfiguration FederationConfiguration
{
    get
    {
        if (_federationConfiguration == null)
        {
            object federationConfigurationLock = FederationConfigurationLock;
            lock (federationConfigurationLock)
            {
                if (_federationConfiguration == null)
                {
                    _federationConfiguration = CreateFederationConfiguration();
                }
            }
        }
        return _federationConfiguration;
    }
}
要总结初始化例程,请执行以下操作:

  • 调用
    FederatedConfiguration
    默认构造函数(调用
    :this(true)
    ,但我离题了)
  • 触发“FederationConfigurationCreated”事件,您的代码将处理该事件并执行它所做的任何操作
  • 光验证
  • 如果尚未初始化,则启动初始化链

    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
    class'
    Initialize()
    方法,以避免在其他情况下调用它们时可能出现的一些副作用

    有一种模式是“如果未初始化,则调用
    Initialize
    ”,它沿着对象链运行,并且由于实现,这些类上的
    IsInitialized
    属性只能设置为返回
    true
    ,前提是它们的
    Initialize()
    方法成功完成

    我能够设置自定义
    ConfigurationManager
    并避免由于.config依赖关系而导致的一些错误的方法是使我的事件处理程序足够聪明,可以先发制人地调用
    Initialize()
    IdentityConfiguration
    对象上的
    方法-这实际上改变了框架的IdentityModel类中的执行路径

    var authZ = new MyClaimsAuthorizationManager();            
    
    FederatedAuthentication.FederationConfigurationCreated += (s, e) =>
    {
        var identityConfiguration = e.FederationConfiguration.IdentityConfiguration;
    
        identityConfiguration.ClaimsAuthorizationManager = authZ;
    
        if (!identityConfiguration.IsInitialized)
            identityConfiguration.Initialize();
        };
    }
    

    有一些blog/SO的答案谈到了如何通过编程来设置,所有这些答案都有一个简单的定位:
    e.FederationConfiguration.IdentityConfiguration.ClaimsAuthorizationManager=new MyCustomClaimsAuthorizationManager();对我来说不幸的是,这还不够,因为我一直在努力完成。希望这能在“简单的答案”还不够的情况下帮助其他人。

    也许这个答案的细微阐述可以帮助其他人,因为我刚刚在MVC 5、.NET 4.5.2中经历了一些非常类似的内容,并发现有必要了解这些组件在引擎盖下的行为

    我的主要目标是:需要最小化.config依赖关系(ffwd:在我有时间的时候,我找到了最小化但不是完全移除的方法)

    我在使用这个答案的方法时遇到的问题是,我不断收到一个错误,说我缺少配置内容。经过一些很好的老反射器反射后,我发现这是由
    FederatedAuthentication
    FederationConfiguation
    IdentityConfiguration
    类之间的mish-mosh、静态getter菊花链、实例构造和成员初始化造成的

    首先,
    FederatedAuthentication
    类的
    FederationConfiguration
    getter属性惰性初始化底层的“FederationConfiguration”字段

    public static FederationConfiguration FederationConfiguration
    {
        get
        {
            if (_federationConfiguration == null)
            {
                object federationConfigurationLock = FederationConfigurationLock;
                lock (federationConfigurationLock)
                {
                    if (_federationConfiguration == null)
                    {
                        _federationConfiguration = CreateFederationConfiguration();
                    }
                }
            }
            return _federationConfiguration;
        }
    }
    
    要总结初始化例程,请执行以下操作:

  • 调用
    FederatedConfiguration
    默认构造函数(调用
    :this(true)
    ,但我离题了)
  • 触发“FederationConfigurationCreated”事件,您的代码将处理该事件并执行它所做的任何操作
  • 光验证
  • 如果尚未初始化,则启动初始化链

    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
    class'
    Initialize()
    方法,以避免在其他情况下调用它们时可能出现的一些副作用

    有一种模式是“如果未初始化,则调用
    Initialize
    ”,它沿着对象链运行,并且由于实现,这些类上的
    IsInitialized
    属性只能设置为返回
    true
    ,前提是它们的
    Initialize()
    方法成功完成

    我能够设置自定义
    ConfigurationManager
    并避免由于.config依赖关系而导致的一些错误的方法是使我的事件处理程序足够智能,可以先发制人地调用