【问题标题】:WCF authentication from html/javascript client来自 html/javascript 客户端的 WCF 身份验证
【发布时间】:2013-08-27 12:30:14
【问题描述】:

我正在开发一个 jQuery mobiel 应用程序。 我有一个 RESTful WCF 服务,它提供一些 JSON 数据,供 jqm 应用使用。

现在我需要为服务实现身份验证。

目前它看起来像这样:

.

【问题讨论】:

    标签: jquery ajax json wcf authentication


    【解决方案1】:

    如果您在 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

    最好的问候 分贝

    【讨论】:

      猜你喜欢
      • 2015-01-10
      • 2011-04-09
      • 2013-10-07
      • 2015-06-13
      • 1970-01-01
      • 2018-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多