2017/06/27

WPF 에서 WebApi 인증

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);
}

댓글 없음:

댓글 쓰기

C# 문자열 포함 여부 확인하기.

ToUpper() 를 사용하면 불필요한 문자열을 생성하므로 좋은 방법은 아니다. string text = "This is an apple." ; string apple = "Apple." ; bool ...