4

私はカスタムを使用してIIdentityおりIPrincipalここで説明されているようにASP.NET MVCアプリケーションで使用しています(そして受け入れられた回答の解決策に従ってください)。また、カスタムがあります。ローカル(を使用)では、正しく機能します。しかし、実際のホストにアプリケーションをアップロードすると、すべてのユーザーが役割を果たしているように見えます。たとえば、役割を持たないユーザーを作成しましたが、保護されているすべてのページ(役割が必要)にアクセスできます。たとえば、常にを返します。何かアイデアはありますか?手伝って頂けますか?やるべき設定はありますか?EF 4.3RoleProviderIIS Express"admin""admin""admin"Role.IsUserInRoletrueIIS

4

2 に答える 2

4

私はその解決策を説明し、それは私のために働きます。私は今はしていませんが、イベントにロールバックする必要があるかもしれません。AuthenticateRequestこの方法を試したい場合はRoleManagerModule、プロジェクトから完全に削除する必要があります。これを試して、うまくいくかどうか教えてください:

// in your module:

public void Init(HttpApplication context) {
    _application = context;
    // rollback this line:
    _application.AuthenticateRequest += ApplicationAuthenticateRequest;
}

// and in web.config

<!-- in system.web section: -->
</system.web>
  <!-- other stufs -->
  <httpModules>
    <remove name="RoleManager"/>
  </httpModules>
</system.web>

<!-- and in system.webServer section: -->
<system.webServer>
  <!-- other stufs -->
  <modules runAllManagedModulesForAllRequests="true">
    <remove name="RoleManager"/>
  </modules>
<system.webServer>
于 2012-06-12T20:08:01.527 に答える
0

デフォルトのRoleManagerを使い続けたい場合は、難しくなります。運が悪かったので、デフォルトから派生して独自のRoleManagerを作成してみました。2日間いくつかのことを試した後、RolePrincipalの拡張メソッドをいくつか作成することになりました。

public static bool IsEmployee(this RolePrincipal principal)
{
    if (IsAuthenticated())
        return principal.IsInRole("Employee");

    return false;
}

public static bool IsAdmin(this RolePrincipal principal)
{
    if (IsAuthenticated())
        return principal.IsInRole("Admin");

    return false;
}

新しいWebViewPageクラスを作成しました。

public abstract class BaseViewPage : WebViewPage
{
    public virtual new RolePrincipal User
    {
        get
        {
            if (base.User == null)
                return null;

            return (RolePrincipal)base.User; //Hard casting: If it goes wrong, it better goes wrong here
        }
    }
}

public abstract class BaseViewPage<TModel> : WebViewPage<TModel>
{
    public virtual new RolePrincipal User
    {
        get
        {
            if (base.User == null)
                return null;

            return (RolePrincipal)base.User; //Hard casting: If it goes wrong, it better goes wrong here
        }
    }
}

viewsフォルダーのweb.configを変更しました。

<pages pageBaseType="MyCompany.MyProject.BaseViewPage">

そして、すべてのコントローラーはBaseControllerから派生しています。

public abstract class BaseController : Controller
{
    protected virtual new RolePrincipal User
    {
        get { return HttpContext.User as RolePrincipal; }
    }
}

欠点は、メソッドが呼び出されるたびにデータベースにクエリを実行することです。私はMVC4btwを使用しています

これが誰かに役立つことを願っています

于 2013-05-12T09:32:34.267 に答える