Asp.Net MVC 授权扩展 ApplicationUser 的自定义用户
Asp.Net MVC authorize a custom user which extends ApplicationUser
我正在使用内置的 authentication/authorization 系统,其中 ApplicationUser
需要登录,一旦通过身份验证,他就会使用 SignInManager
登录。
我还有一个不同的用户 CustomUser
,它扩展了 ApplicationUser
。 CustomUser
通过外部服务进行身份验证。一旦他通过身份验证,我检查他是否存在,如果不存在我创建他并给他 CustomRole
.
我怎样才能保持 CustomUser
的授权?我希望能够放置 [Authorize(Roles="CustomRole")]
属性高于他应该被允许的行为。那可能吗?我需要做什么才能完成这项工作?或者有更好的方法吗?
编辑
下面是 CustomUser 的实现。它位于 Application.Models
下
public class CustomUser : ApplicationUser
{
public int Gender
{
get;
set;
}
public string FCode
{
get;
set;
}
public bool Subscribed
{
get;
set;
}
}
这是 CustomUser
的简化版本。
您应该能够为角色执行如下操作:
[Authorize(Roles = "CustomRole")]
public ActionResult CustomRoleOnly()
{
return View();
}
或者如果它是针对用户
[Authorize(Users = "JoeBloggs, JaneDoe")]
public ActionResult SpecificUserOnly()
{
return View();
}
如果你想按角色授权,你需要创建 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..")]
我正在使用内置的 authentication/authorization 系统,其中 ApplicationUser
需要登录,一旦通过身份验证,他就会使用 SignInManager
登录。
我还有一个不同的用户 CustomUser
,它扩展了 ApplicationUser
。 CustomUser
通过外部服务进行身份验证。一旦他通过身份验证,我检查他是否存在,如果不存在我创建他并给他 CustomRole
.
我怎样才能保持 CustomUser
的授权?我希望能够放置 [Authorize(Roles="CustomRole")]
属性高于他应该被允许的行为。那可能吗?我需要做什么才能完成这项工作?或者有更好的方法吗?
编辑
下面是 CustomUser 的实现。它位于 Application.Models
下public class CustomUser : ApplicationUser
{
public int Gender
{
get;
set;
}
public string FCode
{
get;
set;
}
public bool Subscribed
{
get;
set;
}
}
这是 CustomUser
的简化版本。
您应该能够为角色执行如下操作:
[Authorize(Roles = "CustomRole")]
public ActionResult CustomRoleOnly()
{
return View();
}
或者如果它是针对用户
[Authorize(Users = "JoeBloggs, JaneDoe")]
public ActionResult SpecificUserOnly()
{
return View();
}
如果你想按角色授权,你需要创建 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..")]