我正在尝试将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进行身份验证并获得一个包含以下内容的绿色块: 用户,用户
的角色测试失败这显示成功登录为“User”并且它已进入else代码块但IsUserInRole测试失败。
如果我将not运算符添加到第一个测试[@if(!Roles.IsUserInRole(“MainUser”))],则测试通过。
问题是为什么“用户”未通过IsUserInRole测试。我已经三次检查我的所有角色和用户拼写正确并且用户处于正确的角色。
任何帮助表示感谢。
答案 0 :(得分:1)
如果您在没有FormsAuthentication支持的情况下仅使用OpenId,则可能是RoleProvider不知道如何检查角色。 Roles.IsUserInRole
方法依赖于RoleProvider.IsUserInRole
来检查当前活动用户是否属于所请求的角色。根据MSDN文档,RoleProvider.IsUserInRole
的实际返回值为:
如果指定的用户处于已配置的指定角色,则为true 应用名称;否则,错误。
应在web.config文件中设置此 applicationName 。如果您没有使用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。