C# IsUserInRole在true条件下失败

C# IsUserInRole在true条件下失败,c#,asp.net-mvc-3,razor,openid,C#,Asp.net Mvc 3,Razor,Openid,我正在尝试将OpenID集成到我的MVC3 Razor应用程序中。OpenID正在工作,但当我尝试测试用户在角色中的成员身份时,测试失败 两个角色: “MainUser”,其中一个用户名为“user”。 “GuestUser”,其中一个用户名为“Guest” 这是我Logon.cshtml中的表格 <form action="Authenticate?ReturnUrl=@HttpUtility.UrlEncode(Request.QueryString["ReturnUrl"])" me

我正在尝试将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登录

请单击您的帐户提供商:

@文本框(“openid_标识符”) OpenID是一项服务,允许您使用单个 一致性。查明并

@如果(型号!=null) { if(String.IsNullOrEmpty(Model.UserName)) { @LabelFor(model=>model.OpenID) @DisplayFor(model=>model.OpenID)

@ActionLink(“新用户,注册”,“注册”,新{OpenID=Model.OpenID})

} 其他的 { //用户存在

@Model.UserName, @if(Roles.IsUserInRole(“MainUser”)) { } @if(Roles.IsUserInRole(“GuestUser”)) { }

} }
我运行该应用程序并成功使用OpenId进行身份验证,并获得一个包含以下内容的绿色块: 用户,用户的角色测试失败

这显示作为“用户”成功登录,并且成功登录到else代码块,但IsUserInRole测试失败

如果我将not操作符添加到第一个测试[@If(!Roles.IsUserInRole(“MainUser”)]),则测试通过

问题是为什么“用户”没有通过IsUserInRole测试。我已经三次检查了我所有的角色和用户是否拼写正确,以及用户是否处于正确的角色中


非常感谢您的帮助。

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

如果指定的用户处于所配置用户的指定角色,则为true 应用程序名称;否则,错误

应在web.config文件中设置此applicationName。如果您没有使用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数据库中。但是,如果这个角色Provider不适合您,您可以实现自己的角色Provider。

My配置正确,并且我在应用程序的其他部分成功地使用了IsUserInRole。我的授权数据库已合并到主数据库中。您的第一句话可能就是问题所在,我不使用FormsAuthentication,OpenId表单不会返回到操作,而是通过java脚本处理。这已经成为一个没有实际意义的问题,因为我只需要一次登录,所以我不需要运行IsUserInRole函数。我将把这个标记为答案,并进一步评论,如果我将来应该更多地研究它的话。谢谢,我的配置正确,我在应用程序的其他部分成功地使用了IsUserInRole。我的授权数据库已合并到主数据库中。您的第一句话可能就是问题所在,我不使用FormsAuthentication,OpenId表单从不发回操作,而是通过java脚本处理。这已经成为一个没有实际意义的问题,因为我只需要一次登录,所以我不需要运行IsUserInRole函数。我将把这个标记为答案,并进一步评论,如果我将来应该更多地研究它的话。非常感谢。