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