私のプロジェクト (c#) には、CurrentPrincipal にアタッチするカスタム プリンシパルを作成する HttpModule があります。
これは、すべての MVC3 アプリと従来の ASP.Net アプリで機能しています。
Controller メソッドを保護するために使用する AuthorizeAttribute オーバーライドがあります - かなり標準的なようです。
問題は、カスタム authorizeAttribute で、ユーザー (httpContext.User) が RolePrincipal であり、カスタム プリンシパルではないことです。
トラブルシューティングを行うために、global.asax にいくつかのハンドラーを配置して、beginrequest() と endrequest() をトラップします。さて、BeginRequest では、私の User は私たちが期待するもの、つまりカスタム プリンシパルです。EndRequest では、ユーザーは再び RolePrincipal になります。HttpModule の web.config 宣言は適切です。HttpModule のコードをステップ実行できます。
誰が何が起こっているのか知っていますか?カスタム HttpModule がありますが、このプロジェクトのコードを変更することはできません (どこでも使用されており、正常に動作します)。
これは私の最初の MVC4 プロジェクトです。
以下のコード。私が省略した情報はありますか?
編集: 承認属性コードを追加しました。
Code
(In HttpModule)
private void BeginRequest(object Sender, EventArgs e)
{
HttpContext context = HttpContext.Current;
var Id = new TASBIdentity();
context.User = new TASBPrincipal(Id);
Thread.CurrentPrincipal = context.User;
(etc...)
(In global.asax)
void Application_BeginRequest(object sender, EventArgs e)
{
HttpContext context = HttpContext.Current;
var user = context.User; // user is correct type
}
void Application_EndRequest(object sender, EventArgs e)
{
HttpContext context = HttpContext.Current;
var user = context.User; // user is default type (not correct)
}
(In the authorizeattribute)
public class SecuredByFunctionAttribute : AuthorizeAttribute
{
private readonly string _functionKey;
public SecuredByFunctionAttribute(string functionKey)
{
_functionKey = functionKey;
}
protected override bool AuthorizeCore(System.Web.HttpContextBase httpContext)
{
return httpContext.User.IsInRole(_functionKey);
}