WPF 에서 WebApi 인증
RoleProvider 생성
public class TestRoleProvider : RoleProvider
{
//생략...
public override string[] GetRolesForUser(string username)
{
string[] roles = { "Member" };//get roles by username
return roles;
}
}
RoleProvider 및 인증 설정
<system.web>
<authentication mode="Forms">
<forms loginUrl="~/member/login" timeout="20" slidingExpiration="true" />
</authentication>
<roleManager enabled="true" defaultProvider="TestRoleProvider">
<providers>
<clear />
<add name="TestRoleProvider" type="WebApiTest.TestRoleProvider" />
</providers>
</roleManager>
</system.web>
권한 필터 설정
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(new AuthorizeAttribute());
}
}
Action에 권한 설정
public class ItemController : ApiController
{
Item[] items = new Item[]
{
new Item { Id = "google", Name = "Google" },
new Item { Id = "naver", Name = "Naver" },
new Item { Id = "daum", Name = "Daum" }
};
[System.Web.Http.Authorize(Roles = "Member")]
public IEnumerable<Item> GetAllItems()
{
return items;
}
}
public class MemberController : Controller
{
[HttpPost]
[System.Web.Mvc.AllowAnonymous]
public ActionResult Login(string userId, string password)
{
//사용자 유효성 검사
if (userId == "test" && password == "1234")
{
//인증쿠키 설정
System.Web.Security.FormsAuthentication.SetAuthCookie(userId, false);
return new HttpStatusCodeResult(System.Net.HttpStatusCode.OK);
}
return new HttpStatusCodeResult(System.Net.HttpStatusCode.Unauthorized);
}
}
HttpClient 로그인
private Uri uri = new Uri("http://localhost:59791");
private CookieContainer cookies = new CookieContainer();
private HttpClientHandler handler = new HttpClientHandler();
private HttpClient client;
private ItemCollection items = new ItemCollection();
public MainWindow()
{
InitializeComponent();
this.handler.CookieContainer = this.cookies;
this.client = new HttpClient(this.handler);
this.client.BaseAddress = uri;
this.Login();
this.client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));
this.ItemsList.ItemsSource = this.items;
}
public HttpStatusCode Login()
{
var result = this.client.PostAsync("member/login",
new FormUrlEncodedContent(
new Dictionary<string, string>
{
{"userId", "test"},
{"password", "1234"}
}
)
).Result;
return result.StatusCode;
}
WebApi 사용
private async void GetItems(object sender, RoutedEventArgs e)
{
var response = await client.GetAsync("api/item/getallitems");
response.EnsureSuccessStatusCode();
var items = await response.Content.ReadAsAsync<IEnumerable<Item>>();
this.items.CopyFrom(items);
}
댓글 없음:
댓글 쓰기