0

これにより、「frankl」はアクセスできますが、管理者はブロックされます。私は何を間違えましたか?

 [Authorize(Order=1,Roles = "Admin",Users="frankl")]
public class AuthorizeBaseController_Admins_frank : Controller
{

}

おそらく単純ですが、この2つを組み合わせた例は見当たらず、「Allowmultiple」プロパティを追加しようとするとエラーが発生します。

ありがとう、クリス

4

2 に答える 2

1

ロールとユーザーは排他的に使用する必要があります。それらを組み合わせたい場合は、カスタムの承認属性を作成できます。

public class MyAuthoirizeAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        if (httpContext == null)
        {
            throw new ArgumentNullException("httpContext");
        }
        var user = httpContext.User;
        if (!user.Identity.IsAuthenticated)
        {
            return false;
        }
        var usersSplit = SplitString(Users);
        var rolesSplit = SplitString(Roles);

        return
            (usersSplit.Length > 0 && usersSplit.Contains(user.Identity.Name, StringComparer.OrdinalIgnoreCase)) ||
            (rolesSplit.Length > 0 && rolesSplit.Any(user.IsInRole));
    }

    private string[] SplitString(string original)
    {
        if (string.IsNullOrEmpty(original))
        {
            return new string[0];
        }
        return (from piece in original.Split(',')
                let trimmed = piece.Trim()
                where !string.IsNullOrEmpty(trimmed)
                select trimmed).ToArray();
    }
}

その後:

[MyAuthorize(Order = 1, Roles = "Admin", Users="frankl")]
public class AuthorizeBaseController_Admins_frank : Controller
{
    ...    
}
于 2012-08-15T06:59:15.387 に答える
0

残念ながら、AuthorizeAttribruteは有効なユーザーまたは有効な役割のいずれかを指定できますが、両方を指定することはできません。これがMVC3ソースからの関連するコードです。

protected virtual bool AuthorizeCore(HttpContextBase httpContext) {
    if (httpContext == null) {
        throw new ArgumentNullException("httpContext");
    }

    IPrincipal user = httpContext.User;
    if (!user.Identity.IsAuthenticated) {
        return false;
    }

    if (_usersSplit.Length > 0 && !_usersSplit.Contains(user.Identity.Name, StringComparer.OrdinalIgnoreCase)) {
        return false;
    }

    if (_rolesSplit.Length > 0 && !_rolesSplit.Any(user.IsInRole)) {
        return false;
    }

    return true;
}

'frankl'を管理者にするか、カスタム認証属性を作成する必要があります

于 2012-08-15T04:09:22.840 に答える