Web Api 2身份验证

时间:2014-03-04 10:05:08

标签: c# asp.net-mvc asp.net-web-api asp.net-mvc-5

我对WebApi和MVC有点困惑。 我创建了一个空白的WebApi项目,并选择了个人用户帐户作为身份验证方法。

这生成了 AccountController:ApiController 类。这里有注册,获取用户信息等方法,但没有登录方法。

MVC用户应该如何登录?

干杯, / r3plica

1 个答案:

答案 0 :(得分:0)

在默认Web Api模板中,使用OWIN中间件对用户进行身份验证。

在Startup.Auth.cs中,您可以找到有关身份验证的URL的配置信息。

 static Startup()
    {
        PublicClientId = "self";

        UserManagerFactory = () => new UserManager<IdentityUser>(new UserStore<IdentityUser>());

        OAuthOptions = new OAuthAuthorizationServerOptions
        {
            TokenEndpointPath = new PathString("/Token") - this url for get token for user,
            Provider = new ApplicationOAuthProvider(PublicClientId, UserManagerFactory),
            AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
            AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
            AllowInsecureHttp = true
        };
    }

在参数中使用用户名和密码向TokenEndPointPath发送请求后,OWIN中间件调用方法GrantResourceOwnerCredentials在ApplicationOAuthProvider中使用用户帐户在默认模板中实现。在此方法中,您可以检查用户名和密码并授予用户访问权限。 / p>

您可以在下面找到此方法的默认实现。

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
    {
        using (UserManager<IdentityUser> userManager = _userManagerFactory())
        {
            IdentityUser user = await userManager.FindAsync(context.UserName, context.Password);

            if (user == null)
            {
                context.SetError("invalid_grant", "The user name or password is incorrect.");
                return;
            }

            ClaimsIdentity oAuthIdentity = await userManager.CreateIdentityAsync(user,
                context.Options.AuthenticationType);
            ClaimsIdentity cookiesIdentity = await userManager.CreateIdentityAsync(user,
                CookieAuthenticationDefaults.AuthenticationType);
            AuthenticationProperties properties = CreateProperties(user.UserName);
            AuthenticationTicket ticket = new AuthenticationTicket(oAuthIdentity, properties);
            context.Validated(ticket);
            context.Request.Context.Authentication.SignIn(cookiesIdentity);
        }
    }