asp.net-mvc - WebAPI + SimpleMembership + WebSecurity - 永远无法进行身份验证?

标签 asp.net-mvc cookies asp.net-web-api asp.net-mvc-5 simplemembership

我正在尝试实现单页应用。我从另一个项目 (MVC4) 中继承了一些工作代码来实现身份验证。现在我看到正在设置 cookie,但 WebSecurity/User.Identity 由于某种原因似乎无法正常工作。登录后,后续请求从不通过 WebSecurity.IsAuthenticatedUser.Identity.IsAuthenticated 验证为已验证。有谁知道为什么会这样?

Controller 代码:

public class AccountController : ApiController {

    private readonly UserService _userService;

    public AccountController() {}

    public AccountController(UserService userService) {
        _userService = userService;
    }

    [AllowAnonymous]
    [HttpGet]
    [Route("api/authpayload")]
    // This gets called when the app loads.  Always, User.Identity.IsAuthenticated is false. 
    public HttpResponseMessage AuthPayload() {
        var payload = new AuthPayloadDto();
        try {
            var userId = WebSecurity.GetUserId(User.Identity.Name);
            if (User.Identity.IsAuthenticated && userId > 0) {
                payload.Username = User.Identity.Name;
            } else {
                LogOut();
                payload.IsAuthenticated = false;
            }
            return Request.CreateResponse(HttpStatusCode.OK, payload);
        } catch (Exception e) {
            return Request.CreateResponse(HttpStatusCode.InternalServerError, e);
        }
    }

    [HttpPost]
    [Route("api/login")]
    [AllowAnonymous]
    public HttpResponseMessage LogIn(LoginModel model) {
        if (!ModelState.IsValid)
            return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
        try {
            if (WebSecurity.IsAuthenticated)
                return Request.CreateResponse(HttpStatusCode.Conflict, "already logged in.");
            if (!WebSecurity.UserExists(model.Username))
                return Request.CreateResponse(HttpStatusCode.Conflict, "User does not exist.");
            if (WebSecurity.Login(model.Username, model.Password, persistCookie: model.RememberMe)) {
                // This code always gets hit when I log in, no problems.  I see a new cookie get sent down as well, using Chrome debugger.
                var payload = new AuthPayloadDto();
                return Request.CreateResponse(HttpStatusCode.OK, payload);
            }
            LogOut();
            return Request.CreateResponse(HttpStatusCode.Forbidden, "Login Failed.");
        } catch (Exception e) {
            return Request.CreateResponse(HttpStatusCode.InternalServerError, e);
        }
    }

网络配置:

<system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5" />
    <authentication mode="Forms">
      <forms loginUrl="~/" timeout="2880" />
    </authentication>
    <roleManager enabled="true" defaultProvider="simple">
      <providers>
        <clear />
        <add name="simple" type="WebMatrix.WebData.SimpleRoleProvider, WebMatrix.WebData" />
      </providers>
    </roleManager>
    <membership defaultProvider="simple">
      <providers>
        <clear />
        <add name="simple" type="WebMatrix.WebData.SimpleMembershipProvider, WebMatrix.WebData" />
      </providers>
    </membership>
    <!--
            If you are deploying to a cloud environment that has multiple web server instances,
            you should change session state mode from "InProc" to "Custom". In addition,
            change the connection string named "DefaultConnection" to connect to an instance
            of SQL Server (including SQL Azure and SQL  Compact) instead of to SQL Server Express.
      -->
    <sessionState mode="InProc" customProvider="DefaultSessionProvider">
      <providers>
        <add name="DefaultSessionProvider" type="System.Web.Providers.DefaultSessionStateProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" />
      </providers>
    </sessionState>

  </system.web>

登录后发送的 cookie 没有过期,并且会在后续请求中返回,但 IsAuthenticated 始终为 false。我做错了什么?

更新:

我将我的 web.config 更新为以下内容以使一切正常:

<system.web>
    <authentication mode="None" />
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5" />
    <roleManager enabled="true" defaultProvider="SimpleRoleProvider">
      <providers>
        <clear />
        <add name="SimpleRoleProvider" type="WebMatrix.WebData.SimpleRoleProvider, WebMatrix.WebData" />
      </providers>
    </roleManager>
    <membership defaultProvider="SimpleMembershipProvider">
      <providers>
        <clear />
        <add name="SimpleMembershipProvider" type="WebMatrix.WebData.SimpleMembershipProvider, WebMatrix.WebData" />
      </providers>
    </membership>
  </system.web>

但是我想把它打开,以防有人能解释为什么它有效;我很迷路。

最佳答案

在我当前使用 mssql 的 mvc 4 项目中, 这是一个简单的我所以我只想要非常简单的成员(member)提供者 我禁用了 初始化简单成员属性

[Authorize]
//[InitializeSimpleMembership]
public partial class AccountController : Controller

并将此代码添加到 Application_Start 下的 global.asax

WebSecurity.InitializeDatabaseConnection(
             connectionStringName: "DefaultConnection",
             userTableName: "UserProfile",
             userIdColumn: "UserID",
             userNameColumn: "UserName",
             autoCreateTables: true);

在我的 sql 数据库中,应用程序在其中创建了一些表,这些表是角色,而 UserInRoles 只是添加了我需要的角色,如管理员、客户等... 我通过添加此代码来限制对某些 Controller 或操作的访问

[Authorize(Roles = "Admin")]
public class MessagesController : Controller

关于asp.net-mvc - WebAPI + SimpleMembership + WebSecurity - 永远无法进行身份验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26198189/

相关文章:

c# - "Missing map from System.Char to System.String"AutoMapper 错误

c# - 如何获取列表中值的列总计 - 匿名类型的 double

javascript - 单击链接调用 javascript 函数

codeigniter - 在 codeigniter 中未获取 cookie 值

javascript - 设置不同有效期的cookie

asp.net - 如何使用 HttpClient 将 Json 数据作为参数传递给 web api

c# - Unity 中的装饰器有很多参数

c# - 是什么导致我的 httpcontext.cache 在我的 C# MVC Web 应用程序中被删除?

c# - 如何使用 orderbydescending 在 linq 中查询?

asp.net-mvc - 从 MVC 5 应用程序的 URL 隐藏参数(敏感信息)