使用OAuth身份验证与ASP.NET 5(vnext)MVC6 beta5(没有Asp.Net标识)

时间:2015-07-09 09:21:03

标签: asp.net authentication cookies oauth-2.0 adfs

我尝试在不使用ASP.NET身份的情况下对ASP.NET 5 MVC6 beta5使用OAuth身份验证。

现在,我已经实施了一个简单的cookie身份验证,如果登录表单中指定的登录名存在于数据库中,则无论输入的密码是什么(我都不会为用户存储密码)数据库)。

以下是我使用的软件包:

"dependencies": {

    "Microsoft.AspNet.Authentication": "1.0.0-beta5",
    "Microsoft.AspNet.Authentication.Cookies": "1.0.0-beta5",
    "Microsoft.AspNet.Authentication.OAuth": "1.0.0-beta5",     
    "Microsoft.AspNet.Mvc": "6.0.0-beta5",
    "Microsoft.AspNet.Mvc.TagHelpers": "6.0.0-beta5",
    "Microsoft.AspNet.Diagnostics": "1.0.0-beta5",
    "Microsoft.AspNet.Http": "1.0.0-beta5",
    "Microsoft.AspNet.Server.IIS": "1.0.0-beta5",
    "Microsoft.AspNet.Server.WebListener": "1.0.0-beta5",
    "Microsoft.AspNet.StaticFiles": "1.0.0-beta5",
    "Microsoft.AspNet.Tooling.Razor": "1.0.0-beta5",
    "Microsoft.Framework.Configuration.UserSecrets": "1.0.0-beta5",
    "Microsoft.Framework.Logging": "1.0.0-beta5",
    "Microsoft.Framework.Logging.Console": "1.0.0-beta5",
    "Microsoft.Net.Http.Server": "1.0.0-beta5",
    "EntityFramework": "6.1.3",
},

我在Startup.cs配置方法中设置了这样的cookie身份验证(就在app.UseMvc之前):

app.UseCookieAuthentication(options =>
{
    options.AutomaticAuthentication = true;
    options.LoginPath = new PathString("/Account/Login");
});

这是我在帐户控制器中的登录方法:

//
// POST: /Account/Login
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public IActionResult Login(LoginViewModel model, string returnUrl = null)
{
    ViewBag.ReturnUrl = returnUrl;
        if (ModelState.IsValid)
        {
            User user = securityService.FindUserByUserName(model.UserName);
            if (user != null)
            {
                var claims = new List<Claim> { new Claim(ClaimTypes.Name, user.UserName) };
                var identity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
                Context.Authentication.SignIn(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(identity));

                return RedirectToLocal(returnUrl);
            }
            else
            {
                ModelState.AddModelError(string.Empty, "Invalid login attempt.");
            }
        }

    return View(model);
}

这是位于帐户控制器中的LogOff方法:

//
// POST: /Account/LogOff
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult LogOff()
{
    Context.Authentication.SignOut(CookieAuthenticationDefaults.AuthenticationScheme);
    return RedirectToAction("Login");
}

现在,我想使用此处演示的OAuth身份验证中间件来针对AD FS对用户进行身份验证:Authenticating ASP.NET 5 to AD FS OAuth

但我不知道如何在Login操作中指定使用此中间件进行身份验证(同时传递登录视图中输入的登录名和密码)。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

如果您想要显示Auth类型并根据源或其他因素进行隔离,我会深入研究MVC6过滤器, 特别是授权。如果你想做一个混合(如果外部用户是cookie,如果是内部的话,通过ADFS的oauth,你可以登录发回一个差异路由:即/ api /登录vs /登录基于输入。所以,如果你正在尝试一个表格,比如,一个复选框,一个选择或一些元素来指定ADFS路由与Cookie路由,您收集您的区别标准,并在登录帖子上根据他们的选择指导操作。您可以决定是否喜欢客户端驱动或服务器驱动技术更多。无论哪种方式,代码都可以使用该路由或发布数据附录来引导路径,并且在Startup中,您可以执行以下操作:

public class Startup
{
    public void Configure(IApplicationBuilder app, ILoggerFactory log, IHostingEnvironment env)
    {
        app.Map(new PathString("oauth"), Action<IApplicationBuilder> x =>
        {  
            x.UseOAuthAuthentication(); ... 
        });

        app.Map(new PathString("cookie"), Action<IApplicationBuilder> x => {
 x.UseCookieAuthentication(); ....

    });

一般要点是,如果您需要支持多个证券,您可以建立分支映射, 但如果您只是单独使用OAuth,只需在ConfigureServices(IServiceCollection service)

中添加该服务即可

并使用

中的设置调用DI实例
Configure(IApplicationBuilder app){

    app.USeCookieAuthentication();

}