我假设你在 EDMX 下根本看不到 AspNetUserRoles 表是没有问题的。
您可以通过代码访问此表,并且在大多数情况下就足够了。
通常在 ASP.NET MVC 5 下你有类似
的东西
public class AccountController : Controller
{
private ApplicationUserManager _userManager;
...
public AccountController(ApplicationUserManager userManager, ApplicationSignInManager signInManager)
{
UserManager = userManager;
...
public ApplicationUserManager UserManager
{
get
{
return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
}
private set
{
_userManager = value;
}
}
所以在Login 方法下你可以像这样获得用户角色
[System.Web.Mvc.HttpPost]
[System.Web.Mvc.AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
...
var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, false, shouldLockout: false);
switch (result)
{
case SignInStatus.Success:
{
ApplicationUser user = UserManager.FindByName(model.Email);
var roles = (AppUserRoles[])Enum.GetValues(typeof(AppUserRoles));
foreach (var role in roles)
{
if (UserManager.IsInRole(user.Id, role.ToString()) && role == AppUserRoles.Administrators)
{
// Do what you need here
// logger.Info("Login attempt is success.");
return RedirectToAction("Index", "Admin");
}
您还需要在代码中包含此枚举
public enum AppUserRoles
{
Administrators = 1,
Managers = 2,
Users = 3,
Others = 4
}
另一种方法是使用可在 EDMX 中使用的 STORED PROCEDURE。
CREATE PROCEDURE GetUserRoleByUserId
@UserId nvarchar(128)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
SELECT [UserId],[RoleId] FROM [AspNetUserRoles] WHERE [UserId] LIKE @UserId
END
GO
希望这会对你有所帮助。