一つの方法は、AuthorizeAttribute
のOnAuthorize
メソッドをオーバーライドAuthorizationヘッダーが存在するかどうかを確認し、あなたがそれを見つけた場合、資格情報を抽出し、検証した後、手でIPrincipal
を作成することです。それ以外の場合は、base.OnAuthorization
に電話して、通常の.NETメンバーシップの処理が行われるようにします。
ソース:
public class RoleAuthorizeAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
bool basicValidated = false;
var req = filterContext.HttpContext.Request;
var auth = req.Headers["Authorization"];
if (!string.IsNullOrEmpty(auth))
{
var cred = System.Text.Encoding.ASCII.GetString(Convert.FromBase64String(auth.Substring(6))).Split(':');
var userName = cred[0];
var pass = cred[1];
var membership = new AccountMembershipService();
basicValidated = membership.ValidateUser(userName, pass);
if (!basicValidated)
{
base.OnAuthorization(filterContext);
}
else
{
var roles = System.Web.Security.Roles.GetRolesForUser(userName);
IPrincipal principal = new GenericPrincipal(
new GenericIdentity(userName),roles);
Thread.CurrentPrincipal = principal;
System.Web.HttpContext.Current.User = principal;
}
} else
{
base.OnAuthorization(filterContext);
}
}
}
私はあなたがOnAuthorize方法でプリンシパルにHttpContext.Current.Userを設定することをお勧めします驚いています。確かに、これは、認証されていないユーザーがアクセスでき、Authorize属性を持たないコントローラ/アクションが、認証された場合、現在のユーザーにアクセスできないことを意味します。従来のASP.NETでは、HttpContext.Current.Userを設定する場所はApplication_PostAuthenticateRequestにありますが、MVCでは同じではないでしょうか? – Joe
良い点は、そこに置く方が良いかもしれない。私はそれについて考え、私の答えを修正するでしょう。 – jackmott