Asp.net mvc 在代码中设置ClaimsAuthorizationManager(MVC 5)
我有一个ASP.NETMVC5应用程序,我正在努力获得授权。我读过一些东西,它们总是在web.config文件中设置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
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)
,但我离题了)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()事件处理程序中的code>;对我来说不幸的是,这还不够,因为我一直在努力完成。希望这能在“简单的答案”还不够的情况下帮助其他人。也许这个答案的细微阐述可以帮助其他人,因为我刚刚在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依赖关系而导致的一些错误的方法是使我的事件处理程序足够智能,可以先发制人地调用