Я не уверен, что этот дополнительный уровень косвенности добавляет какую-либо ценность.IPrincipal уже является полиморфным типом, поэтому вы можете выполнить именно то, что вам нужно, гораздо более простым способом.
Вместо AuthorizeRoleContext вы можете просто использовать IPrincipal, предоставляемый Windows Authentication (WindowsPrincipal).
Вместо AuthorizeContextAllowAll вы можете просто реализовать IPrincipal следующим образом:
public AllowAllPrincipal : IPrincipal
{
public bool IsInRole(string role)
{
return true;
}
// also implement the Identity property...
}
Вместо AuthorizeContextAllowNothing реализовать IPrincipal следующим образом:
public AllowNothingPrincipal : IPrincipal
{
public bool IsInRole(string role)
{
return false;
}
// also implement the Identity property...
}
Чтобы настроить его, вы можете добавить его в Global.asax.cs:
private void OnAuthenticateRequest(object sender, EventArgs e)
{
this.Context.User = this.container.Resolve<IPrincipal>();
}
Чтобы настроить Unity с «настоящим» IPrincipal, вы можете настроить его следующим образом:
this.container.RegisterType<IPrincipal>(
new InjectionFactory(
_ => HttpContext.Current.User));
Настроить Unity с AllowAllPrincipal намного проще:
this.container.RegisterType<IPrincipal, AllowAllPrincipal>();
, а также с AllowNothingPrincipal:
this.container.RegisterType<IPrincipal, AllowNothingPrincipal>();
Если вы должны настаивать на подключении собственного AuthorizeContext, вы можете сделать это аналогичным образом.