LightSwitch 2013:使用表单身份验证调用 OData ApplicationData.svc 服务
LightSwitch 2013: Calling the OData ApplicationData.svc service with forms authentication
我编写了一个简单的 LightSwitch 2013 应用程序,它通过添加客户实体来管理 "customers" 并让 LightSwitch 处理附加的 SQL 服务器文件。
LightSwitch 使用 restful 服务 (ApplicationData.svc) 公开数据,可以这样调用:
https://somesite.azurewebsites.net/ApplicationData.svc/Customers
现在,我想添加另一个 Windows 8 Universal App 客户端应用程序(商店和 Phone),除了 "included" HTML 和 Silverlight 桌面客户端。因此,我需要以编程方式调用 restful 服务。
我在启用 表单身份验证 时遇到了困难。所以我尝试通过代码以编程方式登录。我不完全知道发生了什么,我试图用提琴手分析线上的流量。我看到有一个名为 (GET) 的 "LogIn.aspx" 页面,然后使用用户填写的凭据进行回发 (POST)。
我总是收到“401 - 未经授权”的响应。
我最好的猜测是这样的:
var cookieContainer = new CookieContainer();
var clientHandler = new HttpClientHandler { CookieContainer = cookieContainer };
using (var client = new HttpClient(clientHandler))
{
client.BaseAddress = new Uri("https://somesite.azurewebsites.net");
// Get the login page
var loginGet = client.GetAsync("/LogIn.aspx").Result;
loginGet.EnsureSuccessStatusCode();
// Post-back to login page with credentials
var loginPost = client.PostAsync("/LogIn.aspx", new FormUrlEncodedContent(new Dictionary<string, string> {
{ "LoginUser$Username", "myname" },
{ "LoginUser$Password", "mypw"},
{ "LoginUser$LoginButton", "LOG+IN" },
})).Result;
loginPost.EnsureSuccessStatusCode();
// try to get the customers list via OData
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
// Getting a "401 - unauthorized" here:
var response = client.GetAsync("ApplicationData.svc/Customers").Result;
response.EnsureSuccessStatusCode();
}
有人能把我踢到正确的方向吗?
PS:
我知道如果我编写一个 .NET 客户端,我可以只使用 "Lightswitch.ApplicationData" class 来无缝调用 restful 服务。此处建议使用此解决方案:
authenticate Lightswitch Odata service that uses forms authentication
但在我的例子中,我有一个 Windows 8 通用应用程序,所以我无法引用由 LightSwitch 生成的 "Server" 程序集,它基于 .NET 运行时。
所以我终于找到了它....我用 cookie 来处理是完全错误的....
具有 Forms 身份验证的 lightswitch OData 服务通过基本身份验证公开。
https://usernamme:password@somesite.azurewebsites.net/ApplicationData/Customers
当然要确保您使用的是 SSL!
我编写了一个简单的 LightSwitch 2013 应用程序,它通过添加客户实体来管理 "customers" 并让 LightSwitch 处理附加的 SQL 服务器文件。 LightSwitch 使用 restful 服务 (ApplicationData.svc) 公开数据,可以这样调用:
https://somesite.azurewebsites.net/ApplicationData.svc/Customers
现在,我想添加另一个 Windows 8 Universal App 客户端应用程序(商店和 Phone),除了 "included" HTML 和 Silverlight 桌面客户端。因此,我需要以编程方式调用 restful 服务。
我在启用 表单身份验证 时遇到了困难。所以我尝试通过代码以编程方式登录。我不完全知道发生了什么,我试图用提琴手分析线上的流量。我看到有一个名为 (GET) 的 "LogIn.aspx" 页面,然后使用用户填写的凭据进行回发 (POST)。
我总是收到“401 - 未经授权”的响应。
我最好的猜测是这样的:
var cookieContainer = new CookieContainer();
var clientHandler = new HttpClientHandler { CookieContainer = cookieContainer };
using (var client = new HttpClient(clientHandler))
{
client.BaseAddress = new Uri("https://somesite.azurewebsites.net");
// Get the login page
var loginGet = client.GetAsync("/LogIn.aspx").Result;
loginGet.EnsureSuccessStatusCode();
// Post-back to login page with credentials
var loginPost = client.PostAsync("/LogIn.aspx", new FormUrlEncodedContent(new Dictionary<string, string> {
{ "LoginUser$Username", "myname" },
{ "LoginUser$Password", "mypw"},
{ "LoginUser$LoginButton", "LOG+IN" },
})).Result;
loginPost.EnsureSuccessStatusCode();
// try to get the customers list via OData
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
// Getting a "401 - unauthorized" here:
var response = client.GetAsync("ApplicationData.svc/Customers").Result;
response.EnsureSuccessStatusCode();
}
有人能把我踢到正确的方向吗?
PS: 我知道如果我编写一个 .NET 客户端,我可以只使用 "Lightswitch.ApplicationData" class 来无缝调用 restful 服务。此处建议使用此解决方案:
authenticate Lightswitch Odata service that uses forms authentication
但在我的例子中,我有一个 Windows 8 通用应用程序,所以我无法引用由 LightSwitch 生成的 "Server" 程序集,它基于 .NET 运行时。
所以我终于找到了它....我用 cookie 来处理是完全错误的....
具有 Forms 身份验证的 lightswitch OData 服务通过基本身份验证公开。
https://usernamme:password@somesite.azurewebsites.net/ApplicationData/Customers
当然要确保您使用的是 SSL!