0

これが私のSampleControllerアクションメソッドであると仮定します

public ActionResult AdminView()
{
    return View()
}

ログインしたユーザーが管理者ロールに属している場合にこのコントローラー メソッドを呼び出す場合、そうでない場合は、このメソッド呼び出しをブロックし、ユーザーにカスタムの不正アクセス エラー ページを表示する必要があります。

私のasp .net mvc Webアプリケーションでは、ユーザーがログインすると、ユーザーロールをセッションに文字列として保存しています。また、ユーザー ロールを検証する必要がある場合は常に、セッションに保存されている値を "ADMIN_ROLE" などの定数と比較します。しかし、ほとんどすべてのコントローラー アクション メソッドでユーザー ロールをチェックし、ユーザー ロールがコントローラー アクション メソッドに対して制限されている場合は、ユーザーに適切なビューまたは無許可アクセス ページ ビューを返すコードを書いています。

私はグーグルで、このようなものを使用できることを読みました。

[Authorize(Roles="admin")]
public ActionResult AdminView()
{
  return View()
}

しかし、Authorize キーワードと Roles キーワードがどのように機能するかはわかりません。Roles = "Admin" を設定すると、セッションに保存されているユーザー ロール文字列を確認するのにどのように役立つか、またはロールがアクション メソッド用にタグ付けされたロールと一致しない場合に、ユーザーを許可されていないページにリダイレクトする方法。

4

3 に答える 3

1

コメントによると、カスタム認証/承認メカニズムを使用している場合は、ユーザーが管理者ロールを持っているかどうかを確認するカスタム ロジックを配置できるカスタム承認属性を実装する必要があります。以下のようなもの:

public class CustomizedAuthorizeAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        //check for role in session variable "ADMIN_ROLE"

    //if not valid user then set
    filterContext.Result = new RedirectResult(URL)
    }
}
于 2013-04-04T04:39:31.087 に答える
1

私の考えでは、承認のためにコーディングする必要があります。

public class AuthorizeAttribute : FilterAttribute, IAuthorizationFilter
{
    private readonly RoleEnum[] _acceptedRoles;

    public AuthorizeAttribute(params RoleEnum[] acceptedroles)
    {
        _acceptedRoles = acceptedroles;
    }

    public AuthorizeAttribute(params bool[] allowAll)
    {
        if (allowAll[0])
            _acceptedRoles = new RoleEnum[] { RoleEnum.Admin, RoleEnum.user};
    }

    public void OnAuthorization(AuthorizationContext filterContext)
    {
        if (SessionHelper.UserInSession == null)//user not logged in
        {
            FormsAuthentication.SignOut();
            filterContext.Result =
                 new RedirectToRouteResult(new System.Web.Routing.RouteValueDictionary {{ "controller", "Home" },
                                             { "action", "Index" },
                                             { "returnUrl",    filterContext.HttpContext.Request.RawUrl } });//send the user to login page with return url
            return;
        }
        if (!_acceptedRoles.Any(acceptedRole => SessionHelper.UserInSession.UserRoles.Any(currentRole => acceptedRole == currentRole.Role)))
            //allow if any of the user roles is among accepted roles. Else redirect to login page
            throw new UnauthorizedAccessException();

    }
}

これはリターン URL でも機能します。

于 2013-04-04T04:40:58.530 に答える
0

このリンクには小さな素敵な説明があります:

http://weblogs.asp.net/jgalloway/archive/2011/04/28/Looking-at-how-asp-net-mvc-authorize-interacts-with-asp-net-forms-authorization.aspx

これに従って:

ASP.NET MVC には [Authorize] 属性が含まれており、これをコントローラー アクションに配置すると、不正アクセスが禁止されます。AuthorizeAttribute を使用すると、ロールまたはユーザーのリストを指定できます。AuthorizeAttribute をコントローラーに配置することもできます。この場合、コントローラー内のすべてのアクションに適用されます。ログインしていないときに AuthorizeAttribute によって保護されたアクションにアクセスしようとすると、標準のログオン画面が表示され、まだアカウントを持っていない場合は登録するためのリンクが表示されます。

[Authorize] 属性はどのようにログオンにリダイレクトしますか?

AuthorizeAttribute は ActionFilter です。これは、関連付けられたコントローラー アクションの前に実行できることを意味します。AuthorizeAttribute は、IAuthorizationFilter インターフェイスで定義された標準メソッドである OnAuthorization メソッドで主な作業を実行します。MVC ソース コードを確認すると、基礎となるセキュリティ チェックは実際には、ASP.NET コンテキストによって保持されている基礎となる認証情報を調べているだけであることがわかります。

IPrincipal user = httpContext.User;

if (!user.Identity.IsAuthenticated)
{
    return false;
}

ユーザーが認証に失敗すると、HttpUnauthorizedResult ActionResult が返され、HTTP 401 (Unauthorized) ステータス コードが生成されます。ASP.NET フォーム認証がない場合、HTTP 401 ステータス コードがブラウザーに送信され、ブラウザーの既定のログイン プロンプトが表示されます。

于 2013-04-04T04:34:25.810 に答える