免责声明:首先让我说我是 MVC4 + Web Api + 一般 Web 服务 + JQuery 的新手。我可能从错误的角度攻击这个。
我正在尝试在 C# 中为 .NET 4 构建一个 Web MVC App + Web API 以在 Azure 中部署。Web api 将被移动客户端(iOS,使用 RestKit)使用。
Web MVC App 会比较简单。我们想对其使用 Forms Authentication 和 SimpleMembership - 我们已经实现并且工作正常。
我们将使用来自 JQuery (Knockout) 脚本的 Web API 方法来填充网页片段。因此,我们希望 JQuery 使用通过 Forms Authentication 认证的相同身份。
但是,这个想法是移动客户端可以直接调用 Web Api。这些没有表单身份验证。
我们一直在研究 Thinktecture 身份模型(http://nuget.org/packages/Thinktecture.IdentityModel https://github.com/thinktecture/Thinktecture.IdentityModel.40)。我们将 BasicAuth 和 AcessKey 处理程序添加到配置中并且它可以工作(参见下面的代码)。
当您尝试在未经身份验证的情况下访问 webapi 时,浏览器会显示基本身份验证对话框并按预期工作。
“问题”是当您已经通过表单身份验证登录并尝试调用 Web Api 方法时,您仍然会看到基本身份验证对话框。换句话说,Thinktecture IdentityModel 似乎完全忽略了表单身份验证。
我的问题是:
- 我的预期正确吗?一旦我完成了表单身份验证,我不应该做任何其他事情来让 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"));