2017-02-24 74 views
-1

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

+1

您的问题太广泛了,而且有点混乱。角色提供者是ASP.NET成员资格的概念,但你的问题被标记为asp.net-identity,这是一个完全不同的认证系统。这是什么? –

+0

我的意思是asp.net的身份。我对错误的措辞表示歉意。 – starmucks

回答

0

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

添加以下代码到WebApiConfig注册方法

但是,如果我们考虑的情况下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; 
    } 

所有只需要以正确的顺序调用适当的方法。我希望对某人有用。 P.S. 如果您在Visual Studio中创建一个新项目以获得此功能,您只需要打勾:enter image description here

3

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

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

+0

这就是WebAPI立即提供的“开箱即用”不记名令牌解决方案。但是,正如我所指出的,我不想仅仅为此添加整个项目。我怎样才能使这个功能不会膨胀我的决定? – starmucks