【问题标题】:A simple ASP .NET MVC API controller using roles使用角色的简单 ASP .NET MVC API 控制器
【发布时间】:2017-07-15 04:11:44
【问题描述】:

我默认使用 ASP .NET MVC 和授权系统编写了一个 Web 应用程序。我通过外部提供者配置了 IdentityRole 和输入。使用当前数据库,我创建了我的数据上下文。现在我想编写一个 Xamarin.Android 应用程序并连接到我的数据库,我想要一个简单的 API。但是您要访问此 API 的功能仅对具有特定角色的用户可用。 API 非常简单,因此不想添加到 WCF 或 WebAPI 项目草案中。如何做到最好?

【问题讨论】:

  • 你的问题太笼统了,而且有点混乱。角色提供者是一个 ASP.NET 成员资格概念,但您的问题被标记为 asp.net-identity,一个完全不同的身份验证系统。是哪个?
  • 我的意思是 asp .net 身份。对于错误的措辞,我深表歉意。

标签: asp.net-mvc asp.net-web-api asp.net-identity


【解决方案1】:

我想结束并完整回答这个问题并结束这个话题。我一直在寻找如何添加移动客户端连接到 ASP.NET MVC 上现有站点的功能。在我的搜索中,我发现了一篇很棒的文章Justin Hyland on March 2, 2014 原则上,本文中的所有内容都写得很好且清晰,但我想为清晰起见做出一点贡献。 Setup下WebAPIConfig声明需要

在WebApiConfig注册方法中添加如下代码

但是如果我们考虑 ASP.NET MVC 的情况,我们没有这样的文件。这一切都很简单,你只需要这样一个文件来创建文件夹 App_Start。文件内容可以保持原样。

为了消除不可避免出现的错误,我们需要安装两个 nuget 包:Microsoft.AspNet.WebApi 和 Microsoft.AspNet.WebApi.Owin。

太棒了!现在我们可以转到获取token的方法,然后将token添加到查询中,我们可以通过[Authorize]属性获取所需的数据。

一个小评论。如果您需要访问为特定角色关闭的方法,那么文章中的 Authenticate 方法应该添加几行代码。紧接在该行之后:

identity.AddClaim(new Claim(ClaimTypes.Name, user));

添加行:

identity.AddClaim(new Claim(ClaimTypes.Role, role));

其中的角色可以获取如下,例如:

var userIdentity = UserManager.FindAsync(user, password).Result;
var role = RoleManager.FindById(userIdentity.Roles.First().RoleId).Name;

发送请求时必须使用的用户名和密码。

我还想给出一个发送请求和接收响应的代码示例。不必寻找并立即开始编码。

        async Task<string> GetToken(string userName, string password)
        {
        var content = new FormUrlEncodedContent(new[]
        {
            new KeyValuePair<string, string>( "user", userName ),
            new KeyValuePair<string, string> ( "password", password )
        }
        );

        using (var client = new HttpClient())
        {
            HttpResponseMessage response = await client.PostAsync(APP_PATH + "/Authenticate", content);
            var result = await response.Content.ReadAsStringAsync();
            return result;
        }
    }

    async Task<string> GetUserInfo(string token)
    {
        using (var client = CreateClient(token))
        {
            var response = await client.GetAsync(APP_PATH + "/ValidateToken");
            return await response.Content.ReadAsStringAsync();
        }
    }

    HttpClient CreateClient(string accessToken = "")
    {
        var client = new HttpClient();
        if (!string.IsNullOrWhiteSpace(accessToken))
        {
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
        }
        return client;
    }

所有人只需要以正确的顺序调用适当的方法。我希望这对某人有用。 附言 如果您在 Visual Studio 中创建一个新项目来获得此功能,您只需勾选:

【讨论】:

    【解决方案2】:

    首先,您不需要单独的项目来使用 Web Api;您可以在同一个项目中同时使用 MVC 和 Web Api。对于诸如现场 AJAX 请求之类的事情的一次性端点,只需创建返回 JSON 或 XML 的 MVC 操作就可以了,但如果您谈论的是真正的 API,即使它相当简单,我会说去 Web Api .

    您可以像保护 MVC 操作一样保护您的 Web Api 操作,使用 [Authorize] 属性。如果您需要按角色进行限制,您只需将角色传递给该角色。但是,这里最大的区别是,尤其是在您提供移动应用程序的情况下,您需要将授权与请求一起传递。这通常使用Authorization 标头和不记名令牌来完成。基本上,您需要设置一个端点来让用户登录并返回一个令牌。然后,每个需要授权的后续请求都在标头中包含该令牌。

    【讨论】:

    • 这就是 WebAPI 立即提供的东西,带有不记名令牌的“开箱即用”解决方案。但是,正如我所指出的,我不想为此添加整个项目。我怎样才能使这个功能不会夸大我的决定?
    猜你喜欢
    • 2016-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多