2017-02-24 78 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