1

誰かが私を正しい軌道に乗せることができて、今何時間もこれを解決しようとしていることを願っています。
現在、Webアプリケーションを再開発中です。アプリケーションのさまざまな部分へのアクセスを管理するために、MVC4属性を使用したいと思います。私が抱えている問題は、認証とアクセス許可がすべて、Webアプリがインターフェースする必要のあるミドルウェアアプリケーションによって処理されることです。

この制限があっても、セキュリティ属性を使用して、ユーザーが認証されていることをWebアプリに通知できるかどうか疑問に思いました。

4

2 に答える 2

1

はい、既存のAuthorize属性を使用できます。デフォルトのSQLデータベースに依存する代わりに、既存のサービスを使用するカスタムプロバイダーMembershipとプロバイダーを作成するだけです。Role

このような面倒な作業をすべてやりたくない場合は、カスタム承認属性(から派生AuthorizeAttribute)を記述し、メソッド内でAuthorizeCoreサービスを呼び出して、現在のユーザーが目的の役割を持っているかどうかを確認することもできます。

于 2013-02-25T11:53:20.233 に答える
1

間違いなく。それが可能であるだけでなく、それはかなり簡単です。また、ASP.NETの役割を「アクティビティ」と考えることができれば、何も派生させる必要はありません。必要なものはすべて組み込まれています。

securityServiceこれらの例は、ミドルウェアアプリケーションと通信するサービスであり、2つの方法があることを前提GetUserとしていGetUserRolesます。

ログインアクションメソッド

[HttpPost]
public ActionResult Login(LoginModel model, string returnUrl)
{
    if (!ModelState.IsValid) return View();

    var user = securityService.GetUser(model.Username, model.Password);
    if (user == null)
    {
        ModelState.AddModelError("", "Username or password are incorrect.");
        return View();
    }

    FormsAuthentication.SetAuthCookie(user.Username, model.Remember);
    return Redirect(returnUrl);
}

Global.asax.csで

protected void Application_AuthenticateRequest()
{
    if (Request.IsAuthenticated)
    {
        string username = User.Identity.Name;
        string[] roles = securityService.GetUserRoles(username);
        IIdentity identity = new GenericIdentity(username);
        Context.User = new GenericPrincipal(identity, roles);
    }
}

それでおしまい。Login認証を処理し(ユーザーがログインするとき)、Application_AuthenticateRequest承認を処理します(すべての要求で)。Authorize(Roles = "XYZ")次に、 「XYZ」がメソッドから返されるものと一致することを確認して、アクションメソッドの装飾に進みますGetUserRoles

于 2013-02-25T12:46:21.740 に答える