【发布时间】:2013-08-27 12:30:14
【问题描述】:
我正在开发一个 jQuery mobiel 应用程序。 我有一个 RESTful WCF 服务,它提供一些 JSON 数据,供 jqm 应用使用。
现在我需要为服务实现身份验证。
目前它看起来像这样:
.
【问题讨论】:
标签: jquery ajax json wcf authentication
我正在开发一个 jQuery mobiel 应用程序。 我有一个 RESTful WCF 服务,它提供一些 JSON 数据,供 jqm 应用使用。
现在我需要为服务实现身份验证。
目前它看起来像这样:
.
【问题讨论】:
标签: jquery ajax json wcf authentication
如果您在 IIS 中托管服务并且需要自定义用户名/密码验证器,则可以通过实现将实现基本身份验证的 HttpModule 来解决问题。
public class AuthenticationModule : IHttpModule
{
void IHttpModule.Dispose() {}
void IHttpModule.Init(HttpApplication context)
{
context.AuthenticateRequest += ContextOnAuthenticateRequest;
context.EndRequest += ContextOnEndRequest;
}
private void ContextOnEndRequest(object sender, EventArgs eventArgs)
{
HttpContext context = HttpContext.Current;
if(context.Response.StatusCode != 401)
return;
context.Response.AddHeader("WWW-Authenticate", "Basic realm=\"SomeRealm\"");
}
private void ContextOnAuthenticateRequest(object sender, EventArgs eventArgs)
{
HttpContext context = HttpContext.Current;
string authHeader = context.Request.Headers["Authorization"];
if(string.IsNullOrWhiteSpace(authHeader) || !authHeader.StartsWith("Basic "))
DenyAccess();
try
{
var encoded = authHeader.Substring(6);
var decoded = Encoding.UTF8.GetString(Convert.FromBase64String(encoded));
var splits = decoded.Split(':');
var username = splits[0];
var password = splits[1];
var principal = //TODO Validate and return a class implementing System.Security.Principal.IPrincipal
if (principal != null)
context.User = principal;
else
DenyAccess();
}
catch(Exception e)
{
DenyAccess();
}
}
private void DenyAccess()
{
var context = HttpContext.Current;
context.Response.StatusCode = 401;
context.Response.End();
}
}
在您的操作中,您可以通过以下方式获取用户: ServiceSecurityContext.Current.PrimaryIdentity 还要记得将 aspNetCompatibilityEnabled 设置为 true。
从您的 js 客户端中,只需在标题中包含以下内容: 授权:基本 Base64EncodedStringWithUsername:Password
最好的问候 分贝
【讨论】: