【问题标题】:Using OAuth authentication with ASP.NET 5 (vnext) MVC6 beta5 (without Asp.Net Identity)将 OAuth 身份验证与 ASP.NET 5 (vnext) MVC6 beta5(无 Asp.Net Identity)一起使用
【发布时间】:2015-09-27 13:53:28
【问题描述】:

我正在尝试在不使用 ASP.NET 身份的情况下将 OAuth 身份验证与 ASP.NET 5 MVC6 beta5 一起使用。

现在,我已经设置了一个简单的 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);
}

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

//
// 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

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

有什么想法吗?

【问题讨论】:

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


    【解决方案1】:

    如果您想显示两种身份验证类型并根据来源或其他因素进行隔离,我会深入研究 MVC6 过滤器,即 特别授权。如果你想做一个混合(如果是外部用户的 cookie,如果是内部用户,则通过 ADFS 进行 oauth,你可以让登录返回一个差异路由:即 /api/Login 与 /Login 基于输入。所以如果你正在尝试一个表单比如说,一个复选框,一个选择,或者一些元素来指定 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();
    

    }

    【讨论】:

      猜你喜欢
      • 2015-08-06
      • 2017-04-02
      • 1970-01-01
      • 2013-02-10
      • 1970-01-01
      • 1970-01-01
      • 2015-12-15
      • 2023-04-08
      • 1970-01-01
      相关资源
      最近更新 更多