私はWCFで作業しており、に基づいた認証マネージャーを作成してIHttpModule
おり、正常に動作します。Authentication
私のクラスの of メソッドの 1 つは、 にGenericPrincipal
オブジェクトを作成しますContext.User
。
例えば
app.Context.User = new GenericPrincipal(new GenericIdentity("Scott"), new string[] { "read" });
のメソッドの 1 つでService
、ユーザーを割り当てたいのですが、PrincipalPermissionAttribute
どのように機能するかはわかりませんが、常にSecurityException
. 例えば:
[WebGet(UriTemplate = "/", RequestFormat=WebMessageFormat.Xml, ResponseFormat=WebMessageFormat.Xml)]
[PrincipalPermission(SecurityAction.Demand, Role="read")] // it throw SecurityException
public SampleItem GetCollection()
{
bool user = HttpContext.Current.User.IsInRole("read"); // return true
bool user1 = HttpContext.Current.User.IsInRole("write"); // return false
return SampleItem.GetSampleItem();
}
たぶんPrincipalPremissionAttribute
使わないContext.Current.User
?しかし、そうでない場合はどうなりますか?
問題を取り除き、非常に単純な属性を作成してみました
[AttributeUsage(AttributeTargets.Method, AllowMultiple=true, Inherited=false)]
public class MyAuthorizationAttribute : Attribute
{
public MyAuthorizationAttribute(params string[] roles)
{
foreach (string item in roles)
{
if(HttpContext.Current.User.IsInRole(item) == false)
{
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.StatusCode = 401;
HttpContext.Current.Response.AddHeader("WWW-Authenticate", "Basic Realm");
HttpContext.Current.Response.StatusDescription = "Access Denied";
HttpContext.Current.Response.Write("401 Access Denied");
HttpContext.Current.Response.End();
}
}
}
}
しかし、アプリケーションはこれを使用できません。つまり、コンストラクターにブレークポイントを設定するMyAttribute
と、コンパイラーはビークポイントで停止せず、認識しません。
[WebGet(UriTemplate = "/", RequestFormat=WebMessageFormat.Xml, ResponseFormat=WebMessageFormat.Xml)]
[MyAuthorization("read")]
public SampleItem GetCollection()
{
bool user = HttpContext.Current.User.IsInRole("read"); // return true
bool user1 = HttpContext.Current.User.IsInRole("write"); // return false
return SampleItem.GetSampleItem();
}