none
ASP.NET WEB API авторизация\аутентификация для клиентов RRS feed

  • Вопрос

  • Добрый день, друзья!

    Подскажите пожалуйста, кто знает. Как делается аутентификация\авторизация для клиентских приложений с помощью ASP.NET Web Api? Сейчас я пытаюсь реализовать ее с помощью Membership (SimpleMembership provider), но у меня ничего не выходит.

    Порядок моих действий таков: создаю метод Login в котором происходит авторизация, на клиенте (WPF приложение) вызываю этот метод с помощью Http запроса. Успешно прохожу авторизацию и получаю куки. Но! затем хочу вызвать какой либо метод службы Web api , а мне возвращается в ответ, что я не авторизован. Это не смотря на то, что я прикрепил к запросу куки.

    Как думаете, в чем дело?

    18 февраля 2013 г. 10:50

Ответы

  • Решил проблему следующим способом:

        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }
    
            private void Button_Click_1(object sender, RoutedEventArgs e)
            {
                Get();
            }
    
            static async void Get()
            {
                var baseAddress = new Uri("http://localhost:2267/api/Account/Login");
                var cookieContainer = new CookieContainer();
                using (var handler = new HttpClientHandler() { CookieContainer = cookieContainer })
                using (var client = new HttpClient(handler) { BaseAddress = baseAddress })
                {
                    List<KeyValuePair<string, string>> content = new List<KeyValuePair<string, string>>();
                    content.Add(new KeyValuePair<string, string>("UserName", "Admin"));
                    content.Add(new KeyValuePair<string, string>("Password", "P@ssword"));
                    content.Add(new KeyValuePair<string, string>("RememberMe", "true"));
    
                    HttpRequestMessage requestMessage = new HttpRequestMessage();
                    requestMessage.Method = HttpMethod.Post;
                    requestMessage.Content = new FormUrlEncodedContent(content);
                    HttpResponseMessage response = await client.SendAsync(requestMessage);
                    response.EnsureSuccessStatusCode();
                }
    
                using (var handler = new HttpClientHandler() { CookieContainer = cookieContainer })
                using (var client = new HttpClient(handler) { BaseAddress = baseAddress })
                {
                    HttpRequestMessage requestMessage = new HttpRequestMessage();
    
                    requestMessage.Method = HttpMethod.Get;
    
                    client.BaseAddress = new Uri("http://localhost:2267/api/Data/Values", UriKind.Absolute);
                    HttpResponseMessage response = await client.SendAsync(requestMessage);
    
                    if (response.StatusCode == HttpStatusCode.OK)
                    {
                        var result = response.Content.ReadAsStringAsync();
                    }
                }
    
            }
        }
    }
        [AllowAnonymous]
        public class LoginController : ApiController
        {
            private readonly IAccountRepository _accountRepository; 
            public LoginController(IAccountRepository accountRepository)
            {
                _accountRepository = accountRepository;
            }
    
            public HttpResponseMessage Post(LoginModel model)
            {
                if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))
                {
                    HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK);
                    return response;
                }
    
                return Request.CreateResponse(HttpStatusCode.Unauthorized);
            }
    
        }

    Это полный листинг работающего примера авторизации\аутентификации в WPF пиложениях с использованием asp.net forms autentification + membership.

    Хотя мне уже все равно. Я забил на него и реализовал OAuth 2.0 :)

    19 февраля 2013 г. 12:21

Все ответы

  • Как вы получаете куки, и как потом отправляете их обратно, с помощью HttpClient? Покажите этоу часть кода.
    18 февраля 2013 г. 12:17
    Модератор
  •         static async void  Get()
            {
                HttpClient client = new HttpClient();
    
                client.BaseAddress = new Uri("http://localhost:2267/api/Account/Login", UriKind.Absolute);
    
                List<KeyValuePair<string,string>> valuePairs = new List<KeyValuePair<string, string>>();
                valuePairs.Add(new KeyValuePair<string, string>("UserName","Admin"));
                valuePairs.Add(new KeyValuePair<string, string>("Password", "P@ssword"));
                valuePairs.Add(new KeyValuePair<string, string>("RememberMe", "true"));
    
    
                HttpRequestMessage requestMessage = new HttpRequestMessage();
                requestMessage.Method = HttpMethod.Post;
                requestMessage.Content = new FormUrlEncodedContent(valuePairs);
                HttpResponseMessage response = await client.SendAsync(requestMessage);
    
                IEnumerable<string> c = response.Headers.GetValues("Set-Cookie");
    
                requestMessage = new HttpRequestMessage();
    
                requestMessage.Method = HttpMethod.Get;
                requestMessage.Headers.Add("Set-Cookie",c);
    
                client.BaseAddress = new Uri("http://localhost:2267/api/Data/SomeData?DataType=Big", UriKind.Absolute);
                response = await client.SendAsync(requestMessage);
    
            }
    Примерно так
    18 февраля 2013 г. 18:09
  • Решил проблему следующим способом:

        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }
    
            private void Button_Click_1(object sender, RoutedEventArgs e)
            {
                Get();
            }
    
            static async void Get()
            {
                var baseAddress = new Uri("http://localhost:2267/api/Account/Login");
                var cookieContainer = new CookieContainer();
                using (var handler = new HttpClientHandler() { CookieContainer = cookieContainer })
                using (var client = new HttpClient(handler) { BaseAddress = baseAddress })
                {
                    List<KeyValuePair<string, string>> content = new List<KeyValuePair<string, string>>();
                    content.Add(new KeyValuePair<string, string>("UserName", "Admin"));
                    content.Add(new KeyValuePair<string, string>("Password", "P@ssword"));
                    content.Add(new KeyValuePair<string, string>("RememberMe", "true"));
    
                    HttpRequestMessage requestMessage = new HttpRequestMessage();
                    requestMessage.Method = HttpMethod.Post;
                    requestMessage.Content = new FormUrlEncodedContent(content);
                    HttpResponseMessage response = await client.SendAsync(requestMessage);
                    response.EnsureSuccessStatusCode();
                }
    
                using (var handler = new HttpClientHandler() { CookieContainer = cookieContainer })
                using (var client = new HttpClient(handler) { BaseAddress = baseAddress })
                {
                    HttpRequestMessage requestMessage = new HttpRequestMessage();
    
                    requestMessage.Method = HttpMethod.Get;
    
                    client.BaseAddress = new Uri("http://localhost:2267/api/Data/Values", UriKind.Absolute);
                    HttpResponseMessage response = await client.SendAsync(requestMessage);
    
                    if (response.StatusCode == HttpStatusCode.OK)
                    {
                        var result = response.Content.ReadAsStringAsync();
                    }
                }
    
            }
        }
    }
        [AllowAnonymous]
        public class LoginController : ApiController
        {
            private readonly IAccountRepository _accountRepository; 
            public LoginController(IAccountRepository accountRepository)
            {
                _accountRepository = accountRepository;
            }
    
            public HttpResponseMessage Post(LoginModel model)
            {
                if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))
                {
                    HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK);
                    return response;
                }
    
                return Request.CreateResponse(HttpStatusCode.Unauthorized);
            }
    
        }

    Это полный листинг работающего примера авторизации\аутентификации в WPF пиложениях с использованием asp.net forms autentification + membership.

    Хотя мне уже все равно. Я забил на него и реализовал OAuth 2.0 :)

    19 февраля 2013 г. 12:21
  • Подскажите как вы реализовали OAuth 2.0? Не могу разобраться как сделать авторизация для доступа к API без Cookie

    17 марта 2013 г. 8:56