0

Я использую встроенную систему аутентификации/авторизации, где ApplicationUser должен войти в систему и после аутентификации войти в систему с помощью SignInManager.Asp.Net MVC авторизует пользовательский пользователь, который расширяет ApplicationUser

У меня также есть другой пользователь, CustomUser, который распространяется ApplicationUser. CustomUser аутентифицирован через внешнюю службу. Когда он будет аутентифицирован, я проверю, существует ли он, если я не создаю его и не дам ему CustomRole.

Как я могу сохранить это разрешение CustomUser? Я хотел бы иметь возможность разместить атрибут [Authorize(Roles="CustomRole")] над действиями, где он должен быть разрешен. Это возможно? Что мне нужно сделать, чтобы сделать эту работу? Или есть лучший способ?

EDIT

Вот реализация CustomUser. Он расположен под Application.Models

public class CustomUser : ApplicationUser 
{ 
    public int Gender 
    { 
     get; 
     set; 
    } 

    public string FCode 
    { 
     get; 
     set; 
    } 

    public bool Subscribed 
    { 
     get; 
     set; 
    } 
} 

Это упрощенная версия CustomUser.

ответ

0

Если вы хотите уполномочить на роль, необходимо создать Roles с помощью :

userManager.AddToRole(user.Id, "NameOfRole"); 

Вы можете создать регистрационное действие, как показано ниже, любой регистр Пользователь может быть из одной роли. Вы можете создать другую роль для Manager и обновить конкретный пользователь, например, позже.

using (var context = new ApplicationDbContext()) 
{ 
    if (ModelState.IsValid) 
    { 
     var user = new ApplicationUser { UserName = model.Email, Email = model.Email }; 
     var result = await UserManager.CreateAsync(user, model.Password); 

     if (result.Succeeded) 
     { 
      await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false); 
         //adding a role after register 
      var roleStore = new RoleStore<IdentityRole>(context); 
      var roleManager = new RoleManager<IdentityRole>(roleStore); 

      var userStore = new UserStore<ApplicationUser>(context); 
      var userManager = new UserManager<ApplicationUser>(userStore); 
      userManager.AddToRole(user.Id, "SimpleUser"); 
      // For more information on how to enable account confirmation and password reset please visit http://go.microsoft.com/fwlink/?LinkID=320771 
      // Send an email with this link 
      // string code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id); 
      // var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme); 
      // await UserManager.SendEmailAsync(user.Id, "Confirm your account", "Please confirm your account by clicking <a href=\"" + callbackUrl + "\">here</a>"); 

      return RedirectToAction("Index", "Home"); 
     } 
     AddErrors(result); 
    } 
} 

Затем на вашем авторизовать атрибут можно использовать Roles для авторизации.

[Authorize(Roles="Manager, SimpleUser, so on..")] 
+0

Проблема заключается в том, что SignInManager принимает только ApplicationUser, а не расширенный CustomUser. Мне удалось создать CustomUser и добавить к правильной роли, но теперь мне нужно иметь возможность «подписать его» или каким-то образом сообщить системе, какой пользователь использует систему, если это имеет смысл? Так можно ли получить экземпляр SignInManager , который может его подписать? – joks

+0

@joks - это ваш пользовательский интерфейс, который реализуется с помощью 'IdentityUser'? – Valkyrie

+0

@joks Посмотрите на эту статью, вам не нужно создавать модель для пользовательского пользователя, и вы можете использовать ApplicationUser, если вы хотите предоставить дополнительные свойства, вы можете добавить ее в свой класс, как в этой статье: http: // stackoverflow .com/questions/28335353/how-to-extend-available-properties-of-user-identity – Valkyrie

0

Вы должны быть в состоянии сделать что-то вроде ниже роли:

[Authorize(Roles = "CustomRole")] 
public ActionResult CustomRoleOnly() 
{ 
    return View(); 
} 

или если это было для пользователей

[Authorize(Users = "JoeBloggs, JaneDoe")] 
public ActionResult SpecificUserOnly() 
{ 
    return View(); 
}