免责声明:首先我要说我是新手,对MVC4 + Web Api + Web Services(总体上) + JQuery不熟悉。我可能从错误的角度进行攻击。
我正在尝试构建一个C#的Web MVC应用程序+Web API,以便部署到Azure。移动客户端(iOS,使用RestKit)将使用Web API。
Web MVC应用程序相对简单。我们希望为其使用Forms身份验证和SimpleMembership - 我们已经实现并且运行良好。
我们将使用JQuery(Knockout)脚本从Web API方法中提取页面的一部分。因此,我们期望JQuery使用由Forms身份验证进行身份验证的同一身份验证身份。
然而,问题在于,Web Api可以直接被移动客户端调用。这些请求不需要Forms身份验证。
我们一直在研究Thinktecture Identity Model (http://nuget.org/packages/Thinktecture.IdentityModelhttps://github.com/thinktecture/Thinktecture.IdentityModel.40)。我们向配置文件中添加了BasicAuth和AccessKey处理程序,并且它能够工作(请参见下面的代码)。
当您未经身份验证尝试访问Web Api时,浏览器会显示基本身份验证对话框,它可以按预期工作。
“问题”在于,当您已经通过Forms身份验证登录并尝试调用Web Api方法时,仍会出现基本身份验证对话框。换句话说,Thinktecture IdentityModel似乎完全忽略了Forms身份验证。
我的问题是:
- 我的期望是正确的吗?一旦我完成了forms身份验证,是否不需要进行其他任何操作即可让JQuery脚本等从同一浏览器用户会话中访问Web API。
- 如何解决这个问题?
- 如果我的期望不正确,则应该如何处理?也就是说:我如何使JQuery脚本进行身份验证?
我知道Stackoverflow上有大量类似的问题,我真的查找了很多,并看了视频等,但要么我漏掉了一些明显的地方,要么对于新手来说没有清晰的文档。
感谢帮助。谢谢。
public static AuthenticationConfiguration CreateConfiguration()
{
var config = new AuthenticationConfiguration
{
DefaultAuthenticationScheme = "Basic",
EnableSessionToken = true,
SetNoRedirectMarker = true
};
config.AddBasicAuthentication((userName, password) => userName == password, retainPassword: false);
config.AddAccessKey(token =>
{
if (ObfuscatingComparer.IsEqual(token, "accesskey123"))
{
return Principal.Create("Custom",
new Claim("customerid", "123"),
new Claim("email", "foo@customer.com"));
}
return null;
}, AuthenticationOptions.ForQueryString("key"));