【问题标题】:Authentication with ASP.NET MVC site and ServiceStack API使用 ASP.NET MVC 站点和 ServiceStack API 进行身份验证
【发布时间】:2014-12-16 21:57:53
【问题描述】:

我正在使用 ASP.NET MVC 和一个使用 ServiceStack 的 API 开发一个网站。

很快我想添加身份验证。该网站将至少有两种类型的用户“服务提供者”和“服务消费者”,尽管一个用户可以有多个角色。

我愿意使用新的 MVC 身份,但我希望我使用的任何东西都能很好地用于服务堆栈 API 和 MVC“页面”,它们不一定使用 API,但应该根据登录显示不同的内容。我不想要求 javascript 来登录/注销。

我想要使用令牌的解决方案,因为我没有在其他任何地方使用过会话状态,但我对其他选项持开放态度,前提是它们可以在云提供商上水平扩展(用户下一个请求可能会转到不同的 back-结束)。

谁有理想解决方案的例子?

(注意:我对外部托管服务不感兴趣)。

【问题讨论】:

  • (我知道 ServiceStack 身份验证,我已经将它用于 SPA API,但之前没有与 ASP.NET MVC 集成或对其进行标记化)

标签: asp.net-mvc servicestack


【解决方案1】:

ServiceStack 的身份验证也可以被外部 ASP.NET Web 框架使用,ServiceStack and MVC Integration docs 显示了您可以如何使用accept Login credentials from a MVC Controller and register them with ServiceStack

public ActionResult Login(string userName, string password, string redirect=null)
{
    if (ModelState.IsValid)
    {
        try
        {
            using (var authService = ResolveService<AuthenticateService>())
            {
                var response = authService.Authenticate(new Authenticate {
                    provider = CredentialsAuthProvider.Name,
                    UserName = userName,
                    Password = password,
                    RememberMe = true,
                });

                // add ASP.NET auth cookie
                FormsAuthentication.SetAuthCookie(userName, true);

                return Redirect(string.IsNullOrEmpty(redirect) ? "/" : redirect);
            }
        }
        catch (Exception ex)
        {
            ModelState.AddModelError(string.Empty, ex.Message);
        }
    }

    return View("Index", GetViewModel());
}

http://mvc.servicestack.net 现场演示展示了一个使用标准 MVC HTML 表单调用此控制器的示例。

然后你的 MVC 控制器可以继承 ServiceStackController 来访问 Authenticated Users Session 和不同的 ServiceStack 提供者,这里是与 Session 和 Authentication 相关的 API:

public class ServiceStackController : Controller
{
    //...
    ISession SessionBag { get; set; }
    bool IsAuthenticated { get; set; }
    IAuthSession GetSession(bool reload = true);
    TUserSession SessionAs<TUserSession>();
    void ClearSession();
}

启用 OAuth 提供程序

如果您需要,您也可以enable ServiceStack's different OAuth providers,它可以选择直接回调到 ServiceStack 服务或

【讨论】:

  • 我当然希望你能回答,我在这里提出了一个相关问题:stackoverflow.com/questions/27180162/…
  • @Darren 无法告诉您,从未使用过 ASP.NET Identity,因此不确定合适的集成策略是什么。自己没有时间进行研发,但我将探索的一些方法包括一个自定义 AuthProvider,它预计将在 OnAuthentication 回调中通过 MVC 调用,如果这不可能,另一种方法是自己在 ServiceStack 的 Session 中手动保存 AuthUserSession ,您可能还需要自己在响应上手动设置 ServiceStack 的 ss-id / ss-pid cookie,因为 Identity 基于 OWIN 而不是 ASP.NET 上下文,因此可能会忽略任何 cookie SS 集。
  • 如果你有 3 分钟的时间看看我在下面添加的内容,也许我不需要/想要那里的 GeType().Name
  • @Darren 没关系,OperationName 基本上是元数据,用于标识请求 DTO 的名称,在 Views 中没有使用。
【解决方案2】:

除神话回答外,我还需要知道用户是否在视图中进行了身份验证,并且当您执行上述操作时,正常的 Request.IsAuthenticated 不起作用。所以我创建了一个 CustomWebViewPage(要使用它,您必须在 View 文件夹的 Web.config 中更改 *pageBaseType="Your.NameSpace.CustomWebViewPage")。

public abstract class CustomWebViewPage : WebViewPage
{
    private IServiceStackProvider _serviceStackProvider;
    public virtual IServiceStackProvider ServiceStackProvider
    {
        get
        {
            return _serviceStackProvider ?? (_serviceStackProvider =
                new ServiceStackProvider(new AspNetRequest(base.Context, GetType().Name)));
        }
    }

    public virtual bool IsAuthenticated
    {
        get { return ServiceStackProvider.IsAuthenticated; }
    }
}

public abstract class CustomWebViewPage<TModel> : WebViewPage<TModel>
{
    //EXACTLY the same as above method...

【讨论】:

    猜你喜欢
    • 2018-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-21
    • 2014-02-08
    • 2014-08-27
    • 2010-11-27
    • 1970-01-01
    相关资源
    最近更新 更多