首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FormsAuthentication和Ajax请求

FormsAuthentication和Ajax请求
EN

Stack Overflow用户
提问于 2015-02-24 02:19:07
回答 1查看 1.3K关注 0票数 1

当从jQuery发送ajax请求时,我在知道用户是否经过身份验证时遇到了问题。

当用户从其浏览器执行常规请求并且设置了aspxauth cookie时,HttpContext.User.Identity不为空。当用户尝试从jQuery执行ajax请求时,根本不会设置aspxauth

我的Web.Config

代码语言:javascript
复制
<authentication mode="Forms">
    <forms loginUrl="~/" />
</authentication>

设置FormsAuthentication Cookie

代码语言:javascript
复制
var cookie = new AuthCookie
            {
                UserId = user.UserId,
                Email = user.Email,
                Name = user.Name,
                RememberMe = createPersistentCookie,
                TimeZone = user.TimeZone,
                CompanyId = user.CompanyId,
                Roles = new List<string> { user.Role ?? "user" }
            };

            string userData = JsonConvert.SerializeObject(cookie);
            var ticket = new FormsAuthenticationTicket(1, cookie.Email, DateTime.Now,
                                                       DateTime.Now.Add(FormsAuthentication.Timeout),
                                                       createPersistentCookie, userData);
            string encTicket = FormsAuthentication.Encrypt(ticket);
            var httpCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket) { Expires = DateTime.Now.Add(FormsAuthentication.Timeout) };

            _httpContext.Response.Cookies.Add(httpCookie);

当我通过我的broser发出请求时,会出现身份验证cookie:

每当我使用$.get()通过javascript发出请求,或者通过javascript加载javascript脚本/任何其他请求时,我得到:

奇怪的是,在另一个ASP应用程序上,我使用的是WebSecurity,它工作得很好。身份验证cookie总是从客户端发送回服务器。对于这个ASP MVC 5应用程序,当我尝试使用FormAuthentication时,我无法让AuthCookie处理所有请求。

EN

回答 1

Stack Overflow用户

发布于 2015-02-24 04:12:13

您仍然可以使用Authorize等来修饰您的类/方法。如果您希望检查控制器方法内部,则可以访问从System.Web.Mvc.Controller或System.Web.Http.ApiController继承的User属性,这取决于您的控制器风格:

代码语言:javascript
复制
//
// Summary:
//     Returns the current principal associated with this request.
//
// Returns:
//     The current principal associated with this request.
public IPrincipal User { get; set; }

它的使用方法如下:

代码语言:javascript
复制
if (User != null && User.Identity != null && User.Identity.IsAuthenticated)
{
    // user has access - process request
}

编辑:

下面是一个具有ajaxable方法的ApiController示例,该方法使用控制器的User属性而不是HttpContext的属性:

代码语言:javascript
复制
public class HelloController : ApiController
{
    [HttpGet]
    public IHttpActionResult HelloWorld()
    {
        try
        {
            if (User != null && User.Identity != null && User.Identity.IsAuthenticated)
            {
                return Ok("Hello There " + User.Identity.Name + "!");
            }
           else
            {
                return Ok("Hello There Anonymous!");
            }
        }
        catch { throw; }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28680571

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档