0

我正在尝试将 OpenID 集成到我的 MVC3 Razor 应用程序中。OpenID 正在工作,但是当我尝试测试用户在角色中的成员资格时,测试失败。

两个角色:

“MainUser”和一个名为“User”的用户。“GuestUser”和一个名为“Guest”的用户。

这是我的 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 测试。我已经三重检查了我所有的角色和用户拼写是否正确,并且用户的角色是正确的。

任何帮助表示赞赏。

4

1 回答 1

1

如果您只使用 OpenId 而没有 FormsAuthentication 的任何支持,则可能是 RoleProvider 不知道如何检查角色。该Roles.IsUserInRole方法依赖于RoleProvider.IsUserInRole检查当前活动用户是否属于所请求的角色。RoleProvider.IsUserInRole根据 MSDN 文档的实际返回值为:

如果指定用户在配置的 applicationName 的指定角色中,则为 true;否则为假。

这个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 回答