使用角色

时间:2017-02-24 10:50:37

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

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

2 个答案:

答案 0 :(得分:3)

首先,您不需要单独的项目来使用Web Api;您可以在同一个项目中同时使用MVC和Web Api。对于像现场AJAX请求这样的东西的一个端点,只需创建返回JSON或XML的MVC操作就可以了,但如果您正在谈论一个真正的API,即使它相当简单,我和#39; d说去Web Api。

您使用[Authorize]属性保护您的Web Api操作与您的MVC操作非常相似。如果您需要按角色进行限制,则只需将角色传递给该角色即可。但是,这里的最大区别,特别是如果您正在为移动应用提供服务,则您需要将授权与请求一起传递。这通常使用Authorization标头以及承载令牌来完成。基本上,您需要设置一个签署用户的端点并返回一个令牌。然后,每个需要授权的后续请求都会在标头中包含该标记。

答案 1 :(得分:0)

我想完成并完全回答这个问题并关闭此主题。我一直在寻找如何为移动客户端添加连接到ASP.NET MVC上现有站点的能力。在我的搜索中,我发现了一篇很棒的文章Justin Hyland on March 2, 2014 原则上,本文中的所有内容都清晰明了,但我希望为清晰起见做出微小的贡献。 在Setup WebAPIConfig下表示需要

  

在以下代码中添加到WebApiConfig Register方法

但是如果我们考虑ASP.NET MVC的情况,我们就没有这样的文件。这一切都非常简单,你只需要这样一个文件来创建文件夹App_Start。该文件的内容可以完全保留在文章中。

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

出色!现在我们可以转向获取令牌的方法,然后将令牌添加到查询中,我们可以通过属性[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中创建新项目以获得此功能,则只需勾选:enter image description here