0

OpenID を MVC3 Razor アプリケーションに統合しようとしています。OpenID は機能していますが、ロールのユーザーのメンバーシップをテストしようとすると、テストが失敗します。

2 つの役割:

「User」という名前の 1 人のユーザーを持つ「MainUser」。「Guest」という名前の 1 人のユーザーを持つ「GuestUser」。

Logon.cshtml のフォームは次のとおりです。

<form action="Authenticate?ReturnUrl=@HttpUtility.UrlEncode(Request.QueryString["ReturnUrl"])" method="post" id="openid_form">
<input type="hidden" name="action" value="verify" />
<div>
    <fieldset>
        <legend>Login using OpenID</legend>
        <div class="openid_choice">
            <p>
                Please click your account provider:</p>
            <div id="openid_btns">
            </div>
        </div>
        <div id="openid_input_area">
            @Html.TextBox("openid_identifier")
            <input type="submit" value="Log On" />
        </div>
        <noscript>
            <p>
                OpenID is service that allows you to log-on to many different websites using a single
                indentity. Find out <a href="http://openid.net/what/">more about OpenID</a> and
                <a href="http://openid.net/get/">how to get an OpenID enabled account</a>.</p>
        </noscript>
        <div>
            @if (Model != null)
            {
                if (String.IsNullOrEmpty(Model.UserName))
                {
                  <div class="editor-label">
                      @Html.LabelFor(model => model.OpenID)
                  </div>
                  <div class="editor-field">
                      @Html.DisplayFor(model => model.OpenID)
                  </div>
                  <p class="button">
                      @Html.ActionLink("New User ,Register", "Register", new { OpenID = Model.OpenID })
                  </p>
                }
                else
                {
                //user exist 
                  <p class="buttonGreen">

                    @Model.UserName,

                    @if (Roles.IsUserInRole("MainUser"))
                      { <a href="@Url.Action("Index", "Main")">Welcome @Model.UserName, Continue... </a> }

                    @if (Roles.IsUserInRole("GuestUser"))
                      { <a href="@Url.Action("Index", "Guest")">Welcome @Model.UserName, Continue... </a> }

                      <a href="@Url.Action("Index", "Main")">Role test failed for @Model.UserName  </a>
                  </p>
                }
            }
        </div>
    </fieldset>
</div>
</form>

アプリを実行し、OpenId での認証に成功し、次を含む緑色のブロックを取得します: ユーザー、ユーザーのロール テストに失敗しました

これは、「ユーザー」としてのログオンが成功し、else コード ブロックに到達したが、IsUserInRole テストが失敗したことを示しています。

not 演算子を最初のテスト [ @if (!Roles.IsUserInRole("MainUser")) ] に追加すると、テストに合格します。

問題は、「ユーザー」が IsUserInRole テストに失敗する理由です。すべてのロールとユーザーのスペルが正しいこと、およびユーザーが適切なロールに属していることを 3 回確認しました。

どんな助けでも感謝します。

4

1 に答える 1

1

FormsAuthentication からのサポートなしで OpenId のみを使用している場合、RoleProvider がロールを確認する方法を認識していない可能性があります。このメソッドは、現在アクティブなユーザーが要求されたロールに属しているかどうかを確認するためにRoles.IsUserInRole依存しています。MSDN ドキュメントによるとRoleProvider.IsUserInRole、実際の戻り値は次のとおりです。RoleProvider.IsUserInRole

指定されたユーザーが、構成された applicationName の指定されたロールに属している場合は true 。それ以外の場合は false。

このapplicationNameは、web.config ファイルで設定する必要があります。RoleProvider を使用していない場合、それがチェックが失敗し続ける理由です。RoleProvider は、configuration/system.web で次のように定義されています。

<roleManager enabled="true" cacheRolesInCookie="true">
    <providers>
        <clear />
        <add connectionStringName="YourDbConnectionString" 
             applicationName="MySampleAppName"
             name="AspNetSqlRoleProvider" 
             type="System.Web.Security.SqlRoleProvider" />
    </providers>
</roleManager>

もちろん、これは、ロールを aspnetdb データベースに保存することを想定しています。ただし、これがうまくいかない場合は、独自の RoleProvider を実装できます。

于 2012-05-04T09:05:18.303 に答える