最近、特定の役割に属するユーザー用に個別のログインを作成するタスクが与えられました。ログインはメイン ユーザー用に既に実装されており、これは割り当てられたプリンシパルを使用して行われ、Thread.CurrentPrincipal
後でページが読み込まれるたびに値がチェックされます。同じ認証メカニズムを使用するようにコードを変更したため、カスタム ログインでカスタム プリンシパルを作成して に割り当てますThread.CurrentPrincipal
。ここでの問題は、カスタム ログインを使用すると、通常のログインが上書きされ、その逆も同様であるということです。Thread.CurrentPrincipal
両方のログインバリアントが同時に機能することを許可する以外の場所に私の原則を割り当てることは可能ですか? これが不可能な場合は、代替案について学びたいです:)
2 に答える
IPrincipal
DVK からの回答は有効ですが、カスタムsを使用すると、過去に複雑な問題が発生しました。別のアプローチは、 で表される単一のプリンシパルを使用し、ClaimsPrincipal
複数の ID を格納できるという事実を利用することです。IsInRole
次に、たとえばのデフォルトの実装を使用できます。
https://msdn.microsoft.com/en-us/library/system.security.claims.claimsprincipal(v=vs.110).aspx
これは非常に実行可能であり、それほど難しくありません。これを行うための最良の方法は、IPrincipal を含むプロパティを持つカスタム IPrincipal を実装することです。次に、両方をスレッドに格納し、IsInRole メソッドを実装して、承認目的で両方のプリンシパル オブジェクトをチェックできるようにします。いくつかの擬似コード...
public class MyPrincipal : IPrincipal
{
public IPrincipal FormsPrincipal { get; private set; }
public MyPrincipal(IPrincipal formsPrincipal)
{
FormsPrincipal = formsPrincipal;
}
public bool IsInRole(string role)
{
if (someCondition)
{
// check roles for this
}
else
{
return FormsPrincipal.IsInRole(role); // check role against the other principal
}
}
}
次に、PostAuthenticateRequest で、現在のプリンシパルを使用して新しいカスタム プリンシパルを作成し、カスタム プリンシパルを HttpContext.Current プリンシパルとして割り当てます。
多くの詳細を含む優れたリソース: ASP.NET MVC - カスタム IIdentity または IPrincipal の設定