C# IsUserInRole在true条件下失败
我正在尝试将OpenID集成到我的MVC3 Razor应用程序中。OpenID正在工作,但当我尝试测试用户在角色中的成员身份时,测试失败 两个角色: “MainUser”,其中一个用户名为“user”。 “GuestUser”,其中一个用户名为“Guest” 这是我Logon.cshtml中的表格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
<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)
}
其他的
{
//用户存在
}
}
我运行该应用程序并成功使用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函数。我将把这个标记为答案,并进一步评论,如果我将来应该更多地研究它的话。非常感谢。