我在MVC5(VS2013)中使用授权/角色时遇到了麻烦.
身份验证几乎可以开箱即用(也就是说只需使用Visual Studio创建默认的MVC项目).我将DefaultConnection连接字符串更改为有效(但不存在)的数据库.然后我注册一个新的用户和数据库被自动创建,以表,如AspNetUsers和AspNetRoles.
但是,我似乎无法对角色做任何事情.要做的第一件事似乎是使用C#代码添加角色,例如:
Roles.CreateRole("Admin");
Run Code Online (Sandbox Code Playgroud)
我收到一条消息的异常:
"尚未启用角色管理器功能."
我在web.config中使用以下命令启用它:
<roleManager enabled="true"/>
Run Code Online (Sandbox Code Playgroud)
现在得到例外:
"无法连接到SQL Server数据库."
这曾经非常容易使用System.Web.Security.SqlRoleProvider,但不适用于MVC5默认的新提供程序.关于这一点有很多非常复杂的文章,但在我看来,它是如此必要和直接的东西,必须有一个简单的方法来使它工作.
非常感谢任何帮助.
我有一个自定义用户角色类CompanyId作为外键。所以我可以创建与公司相关的用户角色。这意味着管理员角色或任何其他角色本身可以在多个公司中担任。我无法与公司和角色建立多对多关系,因为一家公司的管理员声明可能因另一家公司而异。所以我在用户角色实体中添加了公司 ID。
我的问题是,用户管理器将角色名称作为参数AddToRoleAsync(),我无法使用它,因为角色名称可能是多余的。如果我能够通过 Id 添加用户角色,那就太好了。有解决方法可以实现这一目标吗?
我当前的解决方法是将公司名称添加为角色名称的前缀。喜欢:ABC - 管理员;XYZ - 管理员。我不太喜欢这个,用户也不会。
如果我可以为两者创建一个重载方法AddToRoleAsync(),并IsInRoleAync()通过其 ID 而不是名称来查找角色,那就太好了。
我有以下方法来获取存储在中的角色列表AspNetRoles
[AllowAnonymous]
public async Task<ActionResult> Register()
{
//Get the list of Roles
ViewBag.RoleId = new SelectList(await RoleManager.Roles.ToListAsync(), "Name", "Name");
return View();
}
Run Code Online (Sandbox Code Playgroud)
然后我看到它如下
<div class="form-group">
<label class="col-md-2 control-label">
Select User Role
</label>
<div class="col-md-10">
@foreach (var item in (SelectList)ViewBag.RoleId)
{
<input type="checkbox" name="SelectedRoles" value="@item.Value" class="checkbox-inline" />
@Html.Label(item.Value, new { @class = "control-label" })
}
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
但是一旦我加载页面,我就会收到Object reference not set to an instance of an object.错误
第 175 行:ViewBag.RoleId = new SelectList(await RoleManager.Roles.ToListAsync(), "Name", "Name");
这是RoleManager …