首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在ASP.NET MVC Web API中创建角色和向角色添加用户

如何在ASP.NET MVC Web API中创建角色和向角色添加用户
EN

Stack Overflow用户
提问于 2014-02-13 00:53:24
回答 2查看 19K关注 0票数 18

我有一个使用个人帐户的.NET Web API项目。我可以使用标准的模板AccountController很好地注册用户。但是,我现在希望设置角色,并根据用户类型将用户添加到角色中。

数据库中没有自动设置的角色。如何设置角色以及如何将用户添加到角色?

我能找到的关于它的唯一信息是基于旧的ASP.NET成员资格,所以它失败的原因是没有为它设置存储过程。

我在MSDN上搜索了论坛和教程,但似乎找不到Web API的示例。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-13 01:19:27

您可以使用RoleManager添加角色...

代码语言:javascript
复制
using (var context = new ApplicationDbContext())
{
    var roleStore = new RoleStore<IdentityRole>(context);
    var roleManager = new RoleManager<IdentityRole>(roleStore);

    await roleManager.CreateAsync(new IdentityRole { Name = "Administrator" });

    var userStore = new UserStore<ApplicationUser>(context);
    var userManager = new UserManager<ApplicationUser>(userStore);

    var user = new ApplicationUser { UserName = "admin" };
    await userManager.CreateAsync(user);
    await userManager.AddToRoleAsync(user.Id, "Administrator");
}

您说得对,文档现在有点轻量级。但是我发现,一旦您使用过RoleManager和UserManager,API就很容易被发现(但可能并不总是直观的,有时您必须直接对存储甚至db上下文运行查询)。

票数 23
EN

Stack Overflow用户

发布于 2014-05-29 10:33:16

我花了一段时间才弄明白,但我终于明白了。安东尼,请原谅,我要重发你的很多代码,这样像我这样的笨蛋开发人员就能理解了。

在最新的WebAPI2 (Visual Studio2013更新2)中,注册方法将如下所示:

代码语言:javascript
复制
// POST api/Account/Register
[AllowAnonymous]
[Route("Register")]
public async Task<IHttpActionResult> Register(RegisterBindingModel model)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }

    var user = new ApplicationUser() { UserName = model.Email, Email = model.Email };

    IdentityResult result = await UserManager.CreateAsync(user, model.Password);


    if (!result.Succeeded)
    {
        return GetErrorResult(result);
    }

    return Ok();
}

您要做的是将其替换为以下内容:

代码语言:javascript
复制
// POST api/Account/Register
[AllowAnonymous]
[Route("Register")]
public async Task<IHttpActionResult> Register(RegisterBindingModel model)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }


    IdentityResult result;
    using (var context = new ApplicationDbContext())
    {
        var roleStore = new RoleStore<IdentityRole>(context);
        var roleManager = new RoleManager<IdentityRole>(roleStore);

        await roleManager.CreateAsync(new IdentityRole() { Name = "Admin" });

        var userStore = new UserStore<ApplicationUser>(context);
        var userManager = new UserManager<ApplicationUser>(userStore);

        var user = new ApplicationUser() { UserName = model.Email, Email = model.Email };

        result = await UserManager.CreateAsync(user, model.Password);
        await userManager.AddToRoleAsync(user.Id, "Admin");

    }

    if (!result.Succeeded)
    {
        return GetErrorResult(result);
    }

    return Ok();
}

现在,当你发布它时,它应该可以正常工作,但你可能会遇到进一步的问题。在我这样做之后,我的回应是抱怨DB。

代码语言:javascript
复制
The model backing the <Database> context has changed since the database was created

要修复此错误,我必须进入包管理器控制台并启用迁移。

代码语言:javascript
复制
Enable-Migrations –EnableAutomaticMigrations

然后:

代码语言:javascript
复制
Add Migration

最后:

代码语言:javascript
复制
Update-Database

这里有一篇关于启用迁移的好帖子:http://msdn.microsoft.com/en-us/data/jj554735.aspx

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21734345

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档