我有一个ASP.NET MVC 5应用程序,我正试图让我的头围绕索赔授权。我已经阅读了一些总是在web.config文件中设置ClaimsAuthorizationManager
类的东西。
是否可以在代码中设置自定义ClaimsAuthorizationManager
?
答案 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的菊花链,实例构造以及FederatedAuthentication
,FederationConfiguation
和{{1}之间的成员初始化引起的类。
首先,IdentityConfigution
类的FederatedAuthentication
getter属性延迟初始化基础' FederationConfiguration'字段。
FederationConfiguration
总结初始化例程:
public static FederationConfiguration FederationConfiguration
{
get
{
if (_federationConfiguration == null)
{
object federationConfigurationLock = FederationConfigurationLock;
lock (federationConfigurationLock)
{
if (_federationConfiguration == null)
{
_federationConfiguration = CreateFederationConfiguration();
}
}
}
return _federationConfiguration;
}
}
默认ctor(调用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
方法可以避免一些副作用,如果它们以其他方式为您调用。
有一种模式"如果没有初始化,请致电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();